home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Tools / SFX-Player / Mod / DigiBoosterPro / sources / DBM0player.s
Text File  |  2000-05-08  |  76KB  |  5,262 lines

  1. ;----------------- DIGI Booster PRO By Tap & Walt ----------------
  2. ;             player v 2.16 pure code                     ;
  3. ;             by Tap - Tomasz Piasta                      ;
  4. ;-----------------------------------------------------------------
  5. ;new in 2.16 
  6. ;added pannings and panning envelopes
  7. ;added DSP echo effect commands
  8. ;----------------------------------------------------------------- 
  9. ;You have to fill in following data:
  10. ;
  11. ;    ReadMemAdr - which is start adress of loaded module
  12. ;    ReadMemEnd - which is end adress of loaded module
  13. ;
  14. ;       to configurate DB player use:
  15. ;
  16. ;       AutoBoostEn - 0 - auto boost disabled
  17. ;                   - 1 - auto boost enabled (default)
  18. ;
  19. ;       MasterVol   - which is a master volume of all channels
  20. ;                     (use this parameter in volumeslider)
  21. ;
  22. ;       SongPos     - change song position
  23. ;       PattPos     - change current position in pattern
  24. ;
  25. ;       InstrNames - list of instrument's names (each takes 30 bytes)
  26. ;
  27. ;
  28. ;------------------------------------------------------------------
  29.  
  30.  
  31.     incdir    include:
  32.     include    lvo/exec_lib.i
  33.     include lvo/gadtools_lib.i
  34.     include    lvo/ahi_lib.i
  35.     include    devices/ahi.i
  36.     include    "utility/hooks.i"
  37.  
  38.  
  39. Open        equ    -30
  40. Close        equ     -36
  41. Read        equ    -42
  42. ModeRead    equ    1005
  43.  
  44. Lock        =-84
  45. UnLock        =-90
  46. Examine        =-102
  47. ExNext        =-108
  48. AccesRead    =-2
  49.  
  50. Write        equ -48
  51. ModeWrite    equ 1006    
  52.  
  53. s:
  54.     move.l    4.w,ExecBase
  55.  
  56.     move.l    4.w,a6
  57.     lea    DosName,a1
  58.     moveq    #0,d0
  59.     jsr    _LVOOpenLibrary(a6)
  60.     move.l    d0,DosBase
  61.  
  62.     move.l    4.w,a6
  63.     lea    ReqName,a1
  64.     moveq    #0,d0
  65.     jsr    _LVOOpenLibrary(a6)
  66.     move.l    d0,ReqBase
  67.  
  68.     move.l    #MODULE,ReadMemAdr
  69.     move.l    #ENDMODULE,ReadMemEnd
  70.  
  71.     lea    InstrGeneralPan,a1
  72.     move.l    #256-1,d7
  73. .setpan    move.w    #128,(a1)+
  74.     dbf    d7,.setpan
  75.  
  76.     move.l    ReadMemEnd,d0
  77.     sub.l    ReadMemAdr,d0
  78.     move.l    d0,FileLen
  79.     jsr    DBM0
  80.  
  81.     cmp.w    #1,LoadModError
  82.     beq.w    .WASERROR
  83.  
  84.     clr.w    SongPos
  85.     clr.w    FirstTrack
  86.     clr.w    PattPos
  87.  
  88.     moveq    #0,d0
  89.     move.w    GeneralSpeed,d0
  90.     move.b    d0,Orgtemp
  91.     move.b    Orgtemp,count
  92.     move.w    GeneralTempo,CiaTempo
  93.  
  94.     clr.w    PauseVBL
  95.     clr.b    PauseEn
  96.  
  97.     move.b    #6,Temp
  98.     clr.b    count
  99.     clr.b    count2
  100.  
  101.     lea    channel1,a0
  102.     move.w    #128-1,d7
  103. .clr    jsr    ClearSongData
  104.     lea    ChanArea(a0),a0
  105.     dbf    d7,.Clr
  106.  
  107.  
  108.  
  109.  
  110. .retry
  111.  
  112.     jsr    ahi_initstart
  113.     tst.l    d0
  114.     beq.s    .ok
  115.     bsr    OpenAhiError
  116.     cmp.w    #1,d0
  117.     beq.s    .retry
  118.     clr.l    AhiBase
  119.     bra    .end
  120. .ok
  121.  
  122. .Loop:
  123.     move.l    DosBase,a6
  124.     moveq    #1,d1
  125.     jsr    -198(a6)
  126.     btst    #6,$bfe001
  127.     bne.s    .Loop
  128.  
  129.     jsr    Ahi_End
  130. .END
  131. .WASERROR
  132.     jsr    FreeModule
  133.     rts
  134.  
  135. DOSName:    dc.b    "dos.library",0
  136. reqname:    dc.b    'reqtools.library',0
  137.         even
  138. ExecBase:    dc.l    0
  139. DosBase:    dc.l    0
  140. ReqBase:    dc.l    0
  141. ReadName:    dc.l    0
  142.  
  143. GeneralTempo:    dc.w    125
  144. GeneralSpeed:    dc.w    6
  145. InstrNum:    dc.w    1
  146. FirstTrack:    dc.w    0
  147. ActualTrack:    dc.w    0
  148. TrackNumber:    dc.w    0
  149.  
  150. INSNUM:        dc.w    0
  151. PATNUM:        dc.w    0
  152. SNGNUM:        dc.w    0
  153. SMPNUM:        dc.w    0
  154.  
  155. OrdNum:        dc.w    0
  156.  
  157. OrdNum0:    dc.w    0
  158. OrdNum1:    dc.w    0
  159. OrdNum2:    dc.w    0
  160. OrdNum3:    dc.w    0
  161. OrdNum4:    dc.w    0
  162.  
  163. ActualSong:    dc.w    1
  164.  
  165. FileHandle:    dc.l    0
  166. LoadModError:    dc.w    0
  167. Mode16BitEn:    dc.w    0
  168.  
  169. PP_LENG:    dc.w    0
  170. PP_ADR:        dc.l    0
  171.  
  172. NoLoopEnable:    dc.w    0
  173. MIXITENABLE:    dc.w    0
  174.  
  175. playenable:    dc.w    0
  176. stopenable:    dc.w    0
  177.  
  178. OrgTemp:    dc.b    0
  179. SPAHIENABLE    dc.b    0
  180. PlayPattEn:    dc.w    0
  181. OldSPos:    dc.w    0
  182. EditEnable:    dc.w    0
  183. ACTCHAN:    dc.w    0
  184.  
  185. AutoBoostEn:
  186.         dc.w    1
  187.         even
  188.  
  189. *-----------------------------------------------------------------------*
  190. ;
  191. ; Cleanup Routines
  192.  
  193. ClearSongData:
  194.     movem.l    d0-a6,-(sp)
  195.     move.w    #ChanArea-1,d7
  196. .clrdata
  197.     clr.b    (a0)+
  198.     dbf    d7,.clrdata
  199.     movem.l    (sp)+,d0-a6
  200.     rts
  201.  
  202.     
  203. FreeModule:
  204.     lea    Channel1+OnOffChanA,a0
  205.     moveq    #128-1,d7
  206. .onoff    bclr    #0,(a0)
  207.     lea    ChanArea(a0),a0
  208.     dbf    d7,.onoff
  209.  
  210.     bsr    FreeSong
  211.     bsr    FreeSamples
  212.  
  213.     move.w    #64,MasterVol
  214.     rts
  215.  
  216. FreeSong:
  217.     move.l    #1024-1,d7
  218.     lea    PattAdresses,a5
  219.     lea    PattLens,a4
  220.     moveq    #0,d6
  221.     move.w    TrackNumber,d6
  222.     mulu    #6,d6
  223. FreePatts
  224.     move.l    4,a6
  225.  
  226.     moveq    #0,d5
  227.     move.w    (a4)+,d5
  228.     mulu    d6,d5
  229.     move.l    d5,d0
  230.  
  231.     move.l    (a5),a1        ;adres zajetej pamieci
  232.     tst.l    (a5)+
  233.     beq.s    FreePattsDone
  234.  
  235.     subq.l    #8,a1
  236.     addq.l    #8,d0
  237.     jsr    -210(a6)
  238.     clr.l    -4(a5)
  239. ;    clr.w    -2(a4)
  240.     dbf    d7,FreePatts
  241. FreePattsDone
  242.  
  243.  
  244.     lea    SongOrders,a1
  245.     move.l    #1024-1,d7
  246. MMMCLR1    clr.w    (a1)+
  247.     dbf    d7,MMMCLR1
  248.  
  249.     lea    SongOrders0,a1
  250.     move.l    #[1024+1-1]*5,d7
  251. MMMCLR11
  252.     clr.w    (a1)+
  253.     dbf    d7,MMMCLR11
  254.  
  255.     bsr    ClrModName
  256.  
  257.     lea    SongNameBuffer,a1
  258.     move.w    #42-1,d7
  259. MMMCLR6    clr.b    (a1)+
  260.     dbf    d7,MMMCLR6
  261.  
  262.     lea    SongNameBuffer0,a1
  263.     move.w    #44*5-1,d7
  264. MMMCLR66
  265.     clr.b    (a1)+
  266.     dbf    d7,MMMCLR66
  267.  
  268.     clr.w    PATNUM
  269.     clr.w    ORDNUM
  270.     clr.w    ORDNUM0
  271.     clr.w    ORDNUM1
  272.     clr.w    ORDNUM2
  273.     clr.w    ORDNUM3
  274.     clr.w    ORDNUM4
  275.     clr.w    ActualSong
  276.     move.w    #64,GlobalVol
  277.  
  278.     move.l    Ahi_freq,d7
  279.     lsl.l    #8,d7
  280.     divu    #500,d7
  281.     and.l    #$ffff,d7
  282.     mulu    #64,d7
  283.     lsr.l    #8,d7
  284.     move.l    d7,DSPECHODELAY
  285.  
  286.     move.l    #$8000,DSPECHOFEEDBACK
  287.     move.l    #$8000,DSPECHOMIX
  288.     move.l    #$10000,DSPECHOCROSS
  289.  
  290.  
  291.     lea    DSPParamTab,a1
  292.     move.w    #$40,(a1)
  293.     move.w    #$80,2(a1)
  294.     move.w    #$80,4(a1)
  295.     move.w    #$ff,6(a1)
  296.  
  297.     move.w    #125,RealTempo
  298.     move.w    #125,RealCiaTempo
  299.  
  300.     lea    mask1channels+2,a1
  301.     move.w    #128-1,d7
  302. .clr    move.b    #AHIEDM_DRY,(a1)+
  303.     dbf    d7,.clr
  304.  
  305.     clr.w    FirstTrack
  306.     rts
  307.  
  308.  
  309. ClrModName:
  310.     lea    ModNameBuffer,a1
  311.     move.w    #42-1,d7
  312. MMMCLR4    clr.b    (a1)+
  313.     dbf    d7,MMMCLR4
  314.     rts
  315.  
  316.  
  317.  
  318. FreeSamples:
  319.     move.l    #255-1,d7
  320.     lea    AHI_Samples,a5
  321. FreeSampleLoop
  322.     move.l    4,a6
  323.     move.l    (a5),a1            ;adres zajetej pamieci
  324.     move.l    4(a5),d0
  325.  
  326.     clr.l    8(a5)
  327.     clr.l    12(a5)
  328.     clr.l    4(a5)
  329.  
  330.     tst.l    (a5)
  331.     beq.s    FreeSamMKL
  332.  
  333.     cmp.l    #0,Ahi_Sound0
  334.     beq.s    .8bit
  335.     add.l    d0,d0
  336. .8bit
  337.  
  338.     clr.l    (a5)
  339.     subq.l    #8,a1
  340.     addq.l    #8,d0
  341.     jsr    -210(a6)
  342. FreeSamMKL
  343.     lea    16(a5),a5
  344.     dbf    d7,FreeSampleLoop
  345.  
  346.     lea    SamVol,a1
  347.     move.l    #256-1,d7
  348. MMMCLR2    clr.b    (a1)+
  349.     dbf    d7,MMMCLR2
  350.  
  351.     lea    samfin,a1
  352.     move.l    #256-1,d7
  353. MMMCLR3    move.l    #8363,(a1)+
  354.     dbf    d7,MMMCLR3
  355.  
  356.     lea    InstrNames,a1
  357.     move.l    #30*256/4-1,d7
  358. MMMCLR5    clr.l    (a1)+
  359.     dbf    d7,MMMCLR5
  360.  
  361.     lea    VolEnvelope,a1
  362.     move.l    #134*256/4-1,d7
  363. MMMCLR7    clr.l    (a1)+
  364.     dbf    d7,MMMCLR7
  365.  
  366.     lea    PanEnvelope,a1
  367.     move.l    #134*256/4-1,d7
  368. .MMMCLR7p
  369.     clr.l    (a1)+
  370.     dbf    d7,.MMMCLR7p
  371.  
  372.     lea    SampleType,a1
  373.     move.l    #256*2-1,d7
  374. MMMCLR8    clr.b    (a1)+
  375.     dbf    d7,MMMCLR8
  376.  
  377.     lea    LoopTab,a1
  378.     move.l    #256-1,d7
  379. MMMCLR9    clr.b    (a1)+
  380.     dbf    d7,MMMCLR9
  381.  
  382.     lea    InstrGeneralPan,a1
  383.     move.l    #256-1,d7
  384. MMMCLRA move.w    #128,(a1)+
  385.     dbf    d7,MMMCLRA
  386.  
  387.     bsr    makeinstr
  388.  
  389.     move.w    #125,RealTempo
  390.     move.w    #125,RealCiaTempo
  391.  
  392.     clr.w    INSNUM
  393.     move.w    #64,GlobalVol
  394.  
  395.     tst.w    CANDO
  396.     beq.s    CANTDO
  397.     move.l    #AHIST_M8S,AHI_Sound0
  398.     clr.w    Mode16biten
  399. CANTDO
  400.     rts
  401.  
  402. CANDO:    dc.w    0
  403.  
  404. MakeInstr:
  405.     lea    Instruments,a0
  406.     move.l    #256-1,d7
  407.     moveq    #0,d0
  408. .mi
  409.     move.w    d0,(a0)+
  410.     addq    #1,d0
  411.     dbf    d7,.mi
  412.     rts
  413.  
  414.  
  415. DSPParamTab:
  416.     dc.w    0,0,0,0
  417.  
  418. UpdateEffects:
  419.     lea    DSPParamTab,a0
  420.     moveq    #0,d3
  421.     move.w    (a0),d3
  422.     add.w    #$2000,d3
  423.     jsr    SetDelay
  424.  
  425.     lea    DSPParamTab,a0
  426.     moveq    #0,d3
  427.     move.w    2(a0),d3
  428.     add.w    #$2100,d3
  429.     jsr    SetFeedBack
  430.  
  431.     lea    DSPParamTab,a0
  432.     moveq    #0,d3
  433.     move.w    4(a0),d3
  434.     add.w    #$2200,d3
  435.     jsr    SetMix
  436.  
  437.     lea    DSPParamTab,a0
  438.     moveq    #0,d3
  439.     move.w    6(a0),d3
  440.     add.w    #$2300,d3
  441.     jsr    SetCross
  442.  
  443.     bsr    EchoOn
  444.     rts
  445.  
  446. ChooseReqTitle:
  447.     dc.b    "Digi Booster 2.12 player Request",0
  448.     even
  449.  
  450. RT_TagBase        equ    $80000000
  451. RTEZ_ReqTitle        equ     (RT_TagBase+20)
  452. RTEZ_DefaultResponse    equ     (RT_TagBase+23)
  453. RT_Underscore        equ     (RT_TagBase+11)
  454. RT_ReqPos        equ     (RT_TagBase+3)
  455. REQPOS_CENTERSCR    equ     2
  456. rtEZRequestA        equ    -66
  457.  
  458. ChooseReqTags:
  459.     dc.l    RTEZ_ReqTitle,ChooseReqTitle
  460.     dc.l    RTEZ_DefaultResponse,1
  461.     dc.l    RT_Underscore,'_'
  462.     dc.l    RT_ReqPos,REQPOS_CENTERSCR
  463.     dc.l    0,0
  464.  
  465. OpenChooseReq:
  466.     move.l    ReqBase,a6
  467.     lea    ChooseReqTags,a0
  468.     move.l    #0,a3
  469.     move.l    #0,a4
  470.     jsr    rtEZRequestA(a6)
  471.     rts
  472.  
  473. NotEnoughMemoryError
  474.     movem.l    d0-a6,-(sp)
  475.     move.l    #NoMemoryText,a1
  476.     move.l    #AboutOKText,a2
  477.     bsr    OpenChooseReq
  478.     movem.l    (sp)+,d0-a6
  479.     rts
  480.  
  481. NotEnoughForConvert
  482.     movem.l    d0-a6,-(sp)
  483.     move.l    #NoMemForConvert,a1
  484.     move.l    #AboutOKText,a2
  485.     bsr    OpenChooseReq
  486.     movem.l    (sp)+,d0-a6
  487.     rts
  488.  
  489. ReadError:
  490.     movem.l    d0-a6,-(sp)
  491.     move.l    #ReadErrorText,a1
  492.     move.l    #AboutOKText,a2
  493.     bsr    OpenChooseReq
  494.     movem.l    (sp)+,d0-a6
  495.     rts
  496.  
  497.  
  498. OpenAhiError:
  499.     movem.l    d1-a6,-(sp)
  500.     move.l    #OpenAhiErrorText,a1
  501.     move.l    #OpenAhiErrorAskText,a2
  502.     bsr    OpenChooseReq
  503.     movem.l    (sp)+,d1-a6
  504.     rts
  505.  
  506. OpenAhiError2:
  507.     movem.l    d1-a6,-(sp)
  508.     move.l    #OpenAhiErrorText2,a1
  509.     move.l    #AboutOKText,a2
  510.     bsr    OpenChooseReq
  511.     movem.l    (sp)+,d1-a6
  512.     rts
  513.  
  514.  
  515.  
  516. ReadErrorTEXT:
  517.     dc.b    " Read Error! ",10
  518.     dc.b    0
  519.     even
  520.  
  521. NoMemForConvert:
  522.     dc.b    "Sorry! There is no memory to",10
  523.     dc.b    "convert samples to 16 bit!!!",10
  524.     dc.b    0
  525.     even
  526.  
  527. NoMemoryTEXT:
  528.     dc.b    " Not Enough Memory! ",10
  529.     dc.b    0
  530.     even
  531.  
  532. OpenAhiErrorTEXT:
  533.     dc.b    " Can't open AHI.device !",10
  534.     dc.b    0
  535.     even
  536.  
  537. OpenAhiErrorTEXT2:
  538.     dc.b    " Can't open AHI.device !",10
  539.     dc.b    "       Try again.",10
  540.     dc.b    0
  541.     even
  542.  
  543. OpenAhiErrorASKTEXT:
  544.     dc.b    "_Retry |_Cancel",0
  545.     even
  546.  
  547. AboutOKText:
  548.     dc.b    "_OK",0
  549.     even
  550.  
  551.  
  552.  
  553. ConvertAllTo16BIT:
  554.     movem.l    d0-a6,-(sp)
  555.     cmp.l    #0,Ahi_Sound0
  556.     beq.s    .no16bitmode
  557.  
  558.     move.w    #0,Mode16biten
  559.     move.l    #0,Ahi_Sound0
  560. ;    jsr    FreeSampleBuffer
  561.     move.w    #1,Mode16biten
  562.     move.l    #1,Ahi_Sound0
  563.  
  564.  
  565.     move.l    #255-1,d6
  566.     moveq    #0,d7
  567. .loop
  568.     movem.l    d0-d6/a0-a6,-(sp)
  569.     bsr    ConvertTO16BIT
  570.     movem.l    (sp)+,d0-d6/a0-a6
  571.  
  572.     cmp.w    #-1,d7
  573.     beq.s    NotMem
  574.  
  575.     dbf    d6,.loop
  576.  
  577. .no16bitmode
  578.     movem.l    (sp)+,d0-a6
  579.     rts
  580.  
  581. NotMem:
  582.     jsr    NotEnoughForConvert
  583.  
  584. ;    move.w    #0,Mode16BitEn
  585. ;    move.l    #AHIST_M8S,AHI_Sound0
  586. ;    jsr    ConvertAllTO8bit
  587.  
  588.     movem.l    (sp)+,d0-a6
  589.     rts
  590.  
  591. ConvertTO16BIT:
  592.     lea    SampleType,a6
  593.     tst.b    (a6,d6.w)
  594.     bne.s    .juzjest16bit
  595.     move.b    #1,(a6,d6.w)
  596.     move.l    d6,d7
  597.     lsl.w    #4,d7
  598.     lea    AHI_Samples,a5
  599.     move.l    4(a5,d7.w),d0
  600.     tst.l    d0
  601.     beq.s    .juzjest16bit
  602.  
  603.     movem.l    d1-a6,-(sp)
  604.     move.l    4,a6
  605.     add.l    d0,d0
  606.     addq.l    #8,d0
  607.     move.l    #$10001,d1
  608.     jsr    -198(a6)
  609.     movem.l    (sp)+,d1-a6
  610.     tst.l    d0
  611.     beq    .allocerror
  612.     addq.l    #8,d0
  613.  
  614.     movem.l    d0-a6,-(sp)
  615.     move.l    (a5,d7.w),a2
  616.     move.l    d0,a3
  617.     move.l    4(a5,d7.w),d6
  618. .expandto16
  619.     move.b    (a2)+,(a3)+
  620.     clr.b    (a3)+
  621.     subq.l    #1,d6
  622.     tst.l    d6
  623.     bgt.s    .expandto16
  624.     movem.l    (sp)+,d0-a6
  625.  
  626.     movem.l    d0-a6,-(sp)
  627.     move.l    (a5,d7.w),a1
  628.     move.l    4(a5,d7.w),d0
  629.     subq.l    #8,a1
  630.     addq.l    #8,d0
  631.     move.l    4,a6
  632.     jsr    -210(a6)
  633.     movem.l    (sp)+,d0-a6
  634.  
  635.     move.l    d0,(a5,d7.w)
  636.  
  637. .juzjest16bit
  638.     moveq    #0,d7
  639.     rts
  640.  
  641. .allocerror
  642.     clr.b    (a6,d6.w)
  643.     moveq    #-1,d7
  644.     rts
  645.  
  646.  
  647.  
  648. ; ------------------------- read DBM0
  649. DBM0:
  650.     clr.w    DBM0_DONE1
  651.     clr.w    DBM0_DONE2
  652.     clr.l    DBM0_len
  653.  
  654.     lea    MODBUFFER,a5
  655.     move.l    a5,d2
  656.     move.l    #8,d3
  657.     jsr    ReadMem
  658.     cmp.l    #-1,d0
  659.     beq.w    RM_ReadError
  660.  
  661. ; ----------- read hunks
  662. .mainloop
  663.     move.l    a5,d2
  664.     move.l    #8,d3
  665.     add.l    d3,DBM0_len
  666.     jsr    ReadMem
  667.     cmp.l    #-1,d0
  668.     beq.w    DBM0_ReadError
  669.  
  670.     lea    Headers,a0
  671. .loop
  672.     move.l    (a0)+,d0
  673.     move.l    (a0)+,a1
  674.  
  675.     cmp.l    #-1,d0
  676.     beq.s    .notfound
  677.     cmp.l    (a5),d0
  678.     bne.s    .loop
  679.     addq.w    #1,DBM0_DONE1
  680.  
  681.     move.l    4(a5),d7
  682.     add.l    d7,DBM0_len
  683.  
  684.     jsr    (a1)
  685.     cmp.w    #0,LoadModError
  686.     bne.s    .done
  687.     cmp.w    #9,DBM0_DONE1
  688.     beq.w    .done
  689.     bra.s    .mainloop
  690.  
  691. .notfound
  692.     move.l    4(a5),d3
  693.     add.l    d3,DBM0_len
  694.  
  695.     move.l    DBM0_len,d7
  696.     cmp.l    FileLen,d7
  697.     bge.s    .done
  698.  
  699.     tst.l    d3
  700.     beq.s    .zero
  701.  
  702.     move.l    filehandle,d1
  703.     move.l    a5,d2
  704.     jsr    ReadMem
  705.     cmp.l    #-1,d0
  706.     beq.w    DBM0_ReadError
  707. .zero
  708.     addq.w    #1,DBM0_DONE2
  709.     cmp.w    #10,DBM0_DONE2
  710.     beq.s    .done
  711.     bra.w    .mainloop
  712.  
  713. .done
  714.     movem.l    d0-a6,-(sp)
  715.     bsr    ConvertAllTo16BIT
  716.     movem.l    (sp)+,d0-a6
  717.     rts
  718.  
  719.  
  720. HEADERS:
  721.     dc.b    "NAME"
  722.     dc.l    DBM0_ReadName
  723.  
  724.     dc.b    "INFO"
  725.     dc.l    DBM0_ReadInfo
  726.  
  727.     dc.b    "SONG"
  728.     dc.l    DBM0_ReadSong
  729.  
  730.     dc.b    "INST"
  731.     dc.l    DBM0_ReadInst
  732.  
  733.     dc.b    "PATT"
  734.     dc.l    DBM0_ReadPatt
  735.  
  736.     dc.b    "SMPL"
  737.     dc.l    DBM0_ReadSmpl
  738.  
  739.     dc.b    "VENV"
  740.     dc.l    DBM0_ReadVenv
  741.  
  742.     dc.b    "PENV"
  743.     dc.l    DBM0_ReadPenv
  744.  
  745.     dc.b    "DSPE"
  746.     dc.l    DBM0_ReadDSPecho
  747.     dc.l    -1
  748.  
  749. DBM0_DONE1:
  750.     dc.w    0
  751. DBM0_DONE2:
  752.     dc.w    0
  753. DBM0_len:
  754.     dc.l    0
  755.  
  756. DBM0_ReadError:
  757.     moveq    #-1,d0
  758.     jsr    ReadError
  759.     move.w    #2,LoadModError
  760.     rts
  761.  
  762.  
  763. DBM0_ReadName:
  764.     move.l    filehandle,d1
  765.     move.l    a5,d2
  766.     move.l    4(a5),d3
  767.     jsr    ReadMem
  768.     cmp.l    #-1,d0
  769.     beq.w    DBM0_ReadError
  770.  
  771.     move.l    a5,a6
  772.     lea    ModNameBuffer,a4
  773.     moveq    #42-1,d7
  774. .copyname
  775.     move.b    (a6)+,(a4)+
  776.     dbf    d7,.copyname
  777.     moveq    #0,d0
  778.     rts
  779.  
  780. DBM0_ReadInfo:
  781.     move.l    filehandle,d1
  782.     move.l    a5,d2
  783.     move.l    4(a5),d3
  784.     jsr    ReadMem
  785.     cmp.l    #-1,d0
  786.     beq.w    DBM0_ReadError
  787.  
  788.     move.w    (a5),InsNum
  789.     move.w    2(a5),SmpNum
  790.     move.w    4(a5),SngNum
  791.     move.w    6(a5),PatNum
  792.     subq    #1,InsNum
  793.     subq    #1,SmpNum
  794.     subq    #1,SngNum
  795.     subq    #1,PatNum
  796.     clr.l    AHI_CHAN
  797.     move.w    8(a5),AHI_CHAN+2
  798.     move.w    8(a5),TrackNumber
  799.     moveq    #0,d0
  800.     rts
  801.  
  802.  
  803.  
  804.  
  805. DBM0_ReadSong:
  806.     move.l    a5,d2
  807.     move.l    #46,d3
  808.     jsr    ReadMem
  809.     cmp.l    #-1,d0
  810.     beq.w    DBM0_ReadError
  811.  
  812.     move.l    a5,a6
  813.     lea    SongNameBuffer,a4
  814.     moveq    #42-1,d7
  815. .copyname
  816.     move.b    (a6)+,(a4)+
  817.     dbf    d7,.copyname
  818.     moveq    #0,d0
  819.  
  820.     move.l    #SongOrders,d2
  821.     moveq    #0,d3
  822.     move.w    44(a5),d3
  823.     subq    #1,d3
  824.     move.w    d3,OrdNum
  825.     addq    #1,d3
  826.     add.w    d3,d3
  827.     jsr    ReadMem
  828.     cmp.l    #-1,d0
  829.     beq.w    DBM0_ReadError
  830.  
  831.     move.w    SngNum,d7
  832.     tst.w    d7
  833.     beq.w    .notmore
  834.     subq    #1,d7
  835.  
  836.  
  837.     lea    SongNameBuffer1,a2
  838.     lea    OrdNum1,a3
  839.     lea    SongOrders1,a4
  840. .more
  841.     move.l    a5,d2
  842.     move.l    #46,d3
  843.     jsr    ReadMem
  844.     cmp.l    #-1,d0
  845.     beq.w    DBM0_ReadError
  846.  
  847.     movem.l    d0-a6,-(sp)
  848.     move.l    a5,a6
  849.     lea    (a2),a4
  850.     moveq    #42-1,d6
  851. .copyname2
  852.     move.b    (a6)+,(a4)+
  853.     dbf    d6,.copyname2
  854.     movem.l    (sp)+,d0-a6
  855.  
  856.     move.l    a4,d2
  857.     moveq    #0,d3
  858.     move.w    44(a5),d3
  859.     subq    #1,d3
  860.     move.w    d3,(a3)
  861.     addq    #1,d3
  862.     add.w    d3,d3
  863.     jsr    ReadMem
  864.     cmp.l    #-1,d0
  865.     beq.w    DBM0_ReadError
  866.  
  867.     addq    #2,a3
  868.     add.l    #44,a2
  869.     add.l    #1025*2,a4
  870.  
  871.     dbf    d7,.more
  872. .notmore
  873.     moveq    #0,d0
  874.     rts
  875.  
  876.  
  877.  
  878.  
  879.  
  880. DBM0_ReadInst:
  881.     move.w    InsNum,d7
  882.     moveq    #0,d6
  883. .instloop
  884.     addq    #1,d6
  885.  
  886.     move.l    a5,d2
  887.     move.l    #50,d3
  888.     jsr    ReadMem
  889.     cmp.l    #-1,d0
  890.     beq.w    DBM0_ReadError
  891.  
  892.     lea    InstrNames,a6
  893.     move.l    d6,d5
  894.     mulu    #30,d5
  895.     add.w    d5,a6
  896.     moveq    #30-1,d4
  897.     lea    (a5),a4
  898. .copyname
  899.     move.b    (a4)+,(a6)+
  900.     dbf    d4,.copyname
  901.  
  902.     lea    Instruments,a6
  903.     move.l    d6,d5
  904.     add.w    d5,d5
  905.     move.w    30(a5),(a6,d5.w)
  906.  
  907.     lea    SamVol,a6
  908.     move.w    32(a5),d4
  909.     move.b    d4,-1(a6,d6.w)
  910.  
  911.     lea    SamFin,a6
  912.     move.l    d6,d5
  913.     lsl.w    #2,d5
  914.     move.l    34(a5),(a6,d5.w)
  915.  
  916.     lea    Ahi_Samples,a6
  917.     move.l    d6,d5
  918.     lsl.w    #4,d5
  919.     move.l    38(a5),8(a6,d5.w)
  920.     move.l    42(a5),12(a6,d5.w)
  921.  
  922.     lea    InstrGeneralPan,a6
  923.     move.w    46(a5),d5
  924.     add.w    #128,d5
  925.     move.w    d5,(a6,d6.w*2)
  926.  
  927.     lea    LoopTab,a6
  928.     move.w    48(a5),d5
  929.     move.b    d5,(a6,d6.w)
  930.  
  931.     dbf    d7,.instloop
  932.     moveq    #0,d0
  933.     rts
  934.  
  935.  
  936.  
  937.  
  938.  
  939.  
  940. DBM0_ReadVenv:
  941.     move.l    a5,d2
  942.     move.l    #2,d3
  943.     jsr    ReadMem
  944.     cmp.l    #-1,d0
  945.     beq.w    DBM0_ReadError
  946.  
  947.     move.w    (a5),d7
  948.     beq.s    .exit
  949.     subq    #1,d7
  950. .venvloop
  951.     move.l    a5,d2
  952.     move.l    #2,d3
  953.     jsr    ReadMem
  954.     cmp.l    #-1,d0
  955.     beq.w    DBM0_ReadError
  956.  
  957.     lea    VolEnvelope,a0
  958.     moveq    #0,d6
  959.     move.w    (a5),d6
  960.     subq    #1,d6
  961.     mulu    #134,d6
  962.     add.l    d6,a0
  963.     move.l    a0,d2
  964.  
  965.     move.l    #134,d3
  966.     jsr    ReadMem
  967.     cmp.l    #-1,d0
  968.     beq.w    DBM0_ReadError
  969.  
  970.     dbf    d7,.venvloop
  971. .exit
  972.     moveq    #0,d0
  973.     rts
  974.  
  975.  
  976.  
  977.  
  978. DBM0_ReadPenv:
  979.     move.l    a5,d2
  980.     move.l    #2,d3
  981.     jsr    readmem
  982.     cmp.l    #-1,d0
  983.     beq.w    DBM0_ReadError
  984.  
  985.     move.w    (a5),d7
  986.     beq.s    .exit
  987.     subq    #1,d7
  988. .penvloop
  989.     move.l    a5,d2
  990.     move.l    #2,d3
  991.     jsr    readmem
  992.     cmp.l    #-1,d0
  993.     beq.w    DBM0_ReadError
  994.  
  995.     lea    PanEnvelope,a0
  996.     moveq    #0,d6
  997.     move.w    (a5),d6
  998.     subq    #1,d6
  999.     mulu    #134,d6
  1000.     add.l    d6,a0
  1001.     move.l    a0,d2
  1002.  
  1003.     move.l    #134,d3
  1004.     jsr    readmem
  1005.     cmp.l    #-1,d0
  1006.     beq.w    DBM0_ReadError
  1007.  
  1008.     dbf    d7,.penvloop
  1009. .exit
  1010.     moveq    #0,d0
  1011.     rts
  1012.  
  1013.  
  1014. DBM0_ReadDSPecho:
  1015.     move.l    a5,d2
  1016.     move.l    #2,d3
  1017.     jsr    readmem
  1018.     cmp.l    #-1,d0
  1019.     beq.w    DBM0_ReadError
  1020.  
  1021.  
  1022.     move.w    (a5),mask1channels
  1023.     moveq    #0,d3
  1024.     move.w    (a5),d3
  1025.  
  1026.     move.l    #mask1channels+2,d2
  1027.     jsr    readmem
  1028.     cmp.l    #-1,d0
  1029.     beq.w    DBM0_ReadError
  1030.  
  1031.     move.l    #DSPparamtab,d2
  1032.     move.l    #8,d3
  1033.     jsr    readmem
  1034.     cmp.l    #-1,d0
  1035.     beq.w    DBM0_ReadError
  1036.  
  1037.     rts
  1038.  
  1039.  
  1040.  
  1041. DBM0_ReadPatt:
  1042.     move.l    4.w,a6
  1043.     moveq    #0,d0
  1044.     move.w    TrackNumber,d0
  1045.     mulu    #8,d0
  1046.     mulu    #256,d0
  1047.     addq.l    #8,d0
  1048.     move.l    #$10001,d1
  1049.     jsr    -198(a6)
  1050.     tst.l    d0
  1051.     beq    DBM0_ReadError
  1052.     addq.l    #8,d0
  1053.     move.l    d0,PP_ADR
  1054.  
  1055.  
  1056.     lea    PATTLENS,a3
  1057.     lea    PATTAdresses,a4
  1058.  
  1059.     moveq    #0,d5
  1060.     move.w    PATNUM,d5
  1061. .onepatt
  1062.     move.l    a5,d2
  1063.     move.l    #6,d3
  1064.     jsr    ReadMem
  1065.     cmp.l    #-1,d0
  1066.     beq.w    DBM0_ReadError
  1067.  
  1068.  
  1069.     moveq    #0,d0
  1070.     move.w    (a5),d0
  1071. ;    addq    #1,d0
  1072.     move.w    d0,(a3)+
  1073.     moveq    #0,d1
  1074.     move.w    TrackNumber,d1
  1075.     mulu    #6,d1
  1076.     mulu    d0,d1
  1077.     move.l    d0,d6
  1078.  
  1079. ; ----------- alloc do rozpakowanego
  1080.     move.l    4,a6
  1081.     move.l    d1,d0
  1082.     addq.l    #8,d0
  1083.     move.l    #$10001,d1
  1084.     jsr    -198(a6)
  1085.     tst.l    d0
  1086.     beq    RM_AllocError
  1087.     addq.l    #8,d0
  1088.     move.l    d0,(a4)+
  1089.  
  1090.  
  1091.     move.l    PP_ADR,d2
  1092.     move.l    2(a5),d3
  1093.     jsr    ReadMem
  1094.     cmp.l    #-1,d0
  1095.     beq.w    DBM0_ReadError
  1096.  
  1097.     movem.l    d0-a6,-(sp)
  1098.     move.l    PP_ADR,a0
  1099.     move.l    -4(a4),a2
  1100.     moveq    #0,d4
  1101.     moveq    #0,d5
  1102.     move.w    TrackNumber,d4        ; tracks
  1103.     move.w    -2(a3),d5        ; rows
  1104.     subq    #1,d5
  1105.     bsr    DEPACKPATT
  1106.     movem.l    (sp)+,d0-a6
  1107.  
  1108.     dbf    d5,.onepatt
  1109.  
  1110.  
  1111.     move.l    4.w,a6
  1112.  
  1113.     moveq    #0,d0
  1114.     move.w    TrackNumber,d0
  1115.     mulu    #8,d0
  1116.     mulu    #256,d0
  1117.  
  1118.     move.l    PP_ADR,a1        ;adres zajetej pamieci
  1119.     subq.l    #8,a1
  1120.     addq.l    #8,d0
  1121.     jsr    -210(a6)
  1122.  
  1123.  
  1124.  
  1125.     moveq    #0,d0
  1126.     rts
  1127.  
  1128.  
  1129.  
  1130.  
  1131. DBM0_ReadSmpl:
  1132.     move.w    SmpNum,d7
  1133.     moveq    #0,d6
  1134.  
  1135. .readsample
  1136.     move.l    a5,d2
  1137.     move.l    #8,d3
  1138.     jsr    ReadMem
  1139.     cmp.l    #-1,d0
  1140.     beq.w    DBM0_ReadError
  1141.  
  1142.     addq    #1,d6
  1143.     move.l    4(a5),d3
  1144.     tst.l    d3
  1145.     beq.w    .doloop
  1146.  
  1147.     move.l    (a5),d0
  1148.  
  1149.  
  1150.     btst    #0,d0
  1151.     bne.s    .8bit
  1152.  
  1153.     add.l    d3,d3
  1154.     lea    SampleType,a6
  1155.     move.b    #1,(a6,d6.w)
  1156.     lea    256(a6),a6
  1157.     move.b    #1,(a6,d6.w)
  1158.     move.l    #AHIST_M16S,AHI_Sound0
  1159.     move.w    #1,Mode16BitEn
  1160. .8bit
  1161.  
  1162.  
  1163.     move.l    d3,d0
  1164.     addq.l    #8,d0
  1165.     move.l    #$10001,d1
  1166.     move.l    4,a6
  1167.     jsr    -198(a6)
  1168.     tst.l    d0
  1169.     beq    RM_AllocErrorDBM0SAM
  1170.     addq.l    #8,d0
  1171.  
  1172.     move.l    d6,d5
  1173.     lsl.w    #4,d5
  1174.  
  1175.     lea    Ahi_samples,a6
  1176.     tst.l    4(a5)
  1177.     beq.s    .qw
  1178.     move.l    d0,(a6,d5.w)
  1179. .qw
  1180.     move.l    4(a5),4(a6,d5.w)
  1181. **
  1182.  
  1183.     move.l    d0,d2
  1184.     jsr    ReadMem
  1185.     cmp.l    #-1,d0
  1186.     beq.w    DBM0_ReadError
  1187. .doloop
  1188.     dbf    d7,.readsample
  1189.  
  1190.  
  1191.  
  1192.     moveq    #0,d0
  1193.     rts
  1194.  
  1195.  
  1196.  
  1197.  
  1198. DEPACKPATT:
  1199.     mulu    #6,d4
  1200.     moveq    #0,d2
  1201.     moveq    #0,d3
  1202. .depackloop
  1203.     moveq    #0,d0
  1204.     move.b    (a0)+,d0
  1205.     tst.b    d0
  1206.     beq.w    .NextPos
  1207.  
  1208.     subq    #1,d0
  1209.     mulu    #6,d0
  1210.     add.l    d3,d0
  1211.  
  1212.     moveq    #0,d1
  1213.     move.b    (a0)+,d1
  1214.  
  1215.     btst    #0,d1
  1216.     beq.s    .notakenuta
  1217.     move.b    (a0)+,0(a2,d0.l)
  1218. .notakenuta
  1219.     btst    #1,d1
  1220.     beq.s    .notakenum
  1221.     move.b    (a0)+,1(a2,d0.l)
  1222. .notakenum
  1223.     btst    #2,d1
  1224.     beq.s    .notakeeffcom1
  1225.     move.b    (a0)+,2(a2,d0.l)
  1226. .notakeeffcom1
  1227.     btst    #3,d1
  1228.     beq.s    .notakeeffpar1
  1229.     move.b    (a0)+,3(a2,d0.l)
  1230. .notakeeffpar1
  1231.     btst    #4,d1
  1232.     beq.s    .notakeeffcom2
  1233.     move.b    (a0)+,4(a2,d0.l)
  1234. .notakeeffcom2
  1235.     btst    #5,d1
  1236.     beq.s    .notakeeffpar2
  1237.     move.b    (a0)+,5(a2,d0.l)
  1238. .notakeeffpar2
  1239.     bra.s    .depackloop
  1240.  
  1241. .NextPos:
  1242.     addq    #1,d2
  1243.     move.l    d2,d3
  1244.     mulu    d4,d3
  1245.  
  1246.     cmp.w    d2,d5
  1247.     bge.s    .depackloop
  1248.     rts
  1249.  
  1250. ReadMemAdr:    dc.l    0
  1251. ReadMemEnd:    dc.l    0
  1252. FileLen:    dc.l    0
  1253.  
  1254. ReadMem:
  1255.     movem.l    d0-a6,-(sp)
  1256.     move.l    d2,a0
  1257.     move.l    ReadMemAdr,a1
  1258. .loop
  1259.     cmp.l    ReadMemEnd,a1
  1260.     bge.s    .EndOfFile
  1261.  
  1262.     move.b    (a1)+,(a0)+
  1263.     subq.l    #1,d3
  1264.     tst.l    d3
  1265.     bne.s    .loop
  1266.  
  1267.     move.l    a1,ReadMemAdr
  1268.  
  1269.     movem.l    (sp)+,d0-a6
  1270.     moveq    #0,d0
  1271.     rts
  1272.  
  1273. .EndOfFile
  1274.     move.l    a1,ReadMemAdr
  1275.  
  1276.     movem.l    (sp)+,d0-a6
  1277.     moveq    #0,d0
  1278.     rts
  1279.  
  1280. ; -------------------------------------------------------
  1281.  
  1282. RM_ReadError:
  1283.     moveq    #0,d7
  1284.     move.w    #1,LoadModError
  1285.     jsr    ReadError
  1286.     rts
  1287.  
  1288. RM_AllocErrorDBM0SAM
  1289.     moveq    #0,d7
  1290.     move.w    #1,LoadModError
  1291.     jsr    NotEnoughMemoryError
  1292.     move.l    #AHIST_M8S,AHI_Sound0
  1293.     move.w    #0,Mode16BitEn
  1294.     rts
  1295.  
  1296. RM_AllocError:
  1297.     moveq    #0,d7
  1298.     move.w    #1,LoadModError
  1299.     jsr    NotEnoughMemoryError
  1300.     rts
  1301.  
  1302. RM_AllocSamError:
  1303.     clr.l    (a4)
  1304.     clr.l    4(a4)
  1305.     clr.l    8(a4)
  1306.     clr.l    12(a4)
  1307.     moveq    #0,d7
  1308.     move.w    #1,LoadModError
  1309.     jsr    NotEnoughMemoryError
  1310.     rts
  1311.  
  1312.  
  1313. ChanArea    equ    118
  1314.  
  1315. VolA:        equ    0    ; 2
  1316. SlideVolOldA    equ    2    ; 1
  1317. OldGlobalVolA    equ    3    ; 1
  1318.  
  1319. VolB:        equ    4    ; 2
  1320. SlideVolOldB    equ    6    ; 1
  1321. OldGlobalVolB    equ    7    ; 1
  1322.  
  1323. OLDVolA:    equ    8    ; 2
  1324. OLDVolB:    equ    10    ; 2
  1325. SlideSamOffset    equ    12    ; 2
  1326. OldSlideOffsetA    equ    14    ; 1
  1327. OldSlideOffsetB    equ    15    ; 1
  1328. MainVol:    equ    16    ; 2
  1329.  
  1330. ;ReplaceEnable    equ    18    ; 1
  1331.  
  1332. OFFenable    equ    19    ; 1
  1333. SamOffsetA    equ    20    ; 1
  1334. SamOffsetB    equ    21    ; 1
  1335. RetraceCntA    equ    22    ; 1
  1336. RetraceCntB    equ    23    ; 1
  1337. OldInstrNumA:    equ    24    ; 1
  1338. OldInstrNumB:    equ    25    ; 1
  1339.  
  1340. OrgPeriod    equ    26    ; 2
  1341. MainPeriod:    equ    28    ; 2
  1342. OldPeriod:    equ    30    ; 2
  1343. OrgPeriodARP    equ    32    ; 2
  1344. Oldd0        equ    34    ; 2
  1345. Oldd1        equ    36    ; 2
  1346. Oldd2        equ    38    ; 2
  1347. Oldd3        equ    40    ; 2
  1348. Oldd4        equ    42    ; 2
  1349. Oldd5        equ    44    ; 2
  1350. Oldd6        equ    46    ; 2
  1351. loopsdataschanA    equ    48    ; 4
  1352. loopsdataschanB    equ    52    ; 4
  1353.  
  1354. EqNewSamA    equ    56    ; 1
  1355. EqNewSamB    equ    57    ; 1
  1356.  
  1357. VolEnvTime    equ    58    ; 2
  1358. VolEnvOff    equ    60    ; 1
  1359. VolEnvMode    equ    61    ; 1
  1360.  
  1361. PortUpOldValA    equ    62    ; 1
  1362. PortUpOldValB    equ    63    ; 1
  1363. PortDownOldValA    equ    64    ; 1
  1364. PortDownOldValB    equ    65    ; 1
  1365. VibratoDatasA    equ    66    ; 4
  1366. VibratoDatasB    equ    70    ; 4
  1367. GlissandoDatasA    equ    74    ; 6
  1368. GlissandoDatasB    equ    80    ; 6
  1369.  
  1370. NoteDelayPeriodA    equ    86    ; 2
  1371. NoteDelayInstrNumA    equ    88    ; 2
  1372. NoteDelayPeriodB    equ    90    ; 2
  1373. NoteDelayInstrNumB    equ    92    ; 2
  1374.  
  1375. PanPos        equ    94    ; 4        ; it is a calculated panning
  1376.  
  1377. OnOffChanA    equ    98    ; 1
  1378. OnOffChanB    equ    99    ; 1
  1379.  
  1380. PanEnvTime    equ    100    ; 2
  1381. PanEnvOff    equ    102    ; 1
  1382. PanEnvMode    equ    103    ; 1
  1383.  
  1384. GeneralPan    equ    104    ; 2        ; it is a default pan 
  1385.                         ; changeable by 8xx e8x and
  1386.                         ; general pan parameter in pan env
  1387.                         ; range (0-256)
  1388.  
  1389. OldMainVol:    equ    106    ; 2
  1390. OldPanPos:    equ    108    ; 4
  1391.  
  1392. SlidePanOldA    equ    112    ; 1
  1393. SlidePanOldB    equ    113    ; 1
  1394.  
  1395. LastFreq    equ    114    ; 4
  1396. ;----------------------------------------------
  1397.  
  1398.  
  1399. ahibase:    dc.l    0
  1400. ahi_ctrl:    dc.l    0
  1401.  
  1402. ahi_ctrltags:
  1403.         dc.l    AHIC_Play,1
  1404.         dc.l    TAG_DONE
  1405. ahi_tags
  1406.         dc.l    AHIA_MixFreq
  1407. ahi_freq
  1408.         dc.l    32600
  1409.         dc.l    AHIA_Channels
  1410. ahi_chan:
  1411.         dc.l    8
  1412.         dc.l    AHIA_Sounds,1
  1413.         dc.l    AHIA_AudioID
  1414. ahi_audioid
  1415.         dc.l    $00020004    ; 2 pan, 4 stereo, 6 mono   8 8bit pan
  1416.         dc.l    AHIA_SoundFunc,SoundFunc
  1417.         dc.l    AHIA_PlayerFunc,PlayerFunc
  1418.         dc.l    AHIA_PlayerFreq,50<<16
  1419.         dc.l    AHIA_MinPlayerFreq,(8*2/5)<<16
  1420.         dc.l    AHIA_MaxPlayerFreq,(600*2/5)<<16
  1421.         dc.l    TAG_DONE
  1422.  
  1423. ahi_sound0:
  1424.         dc.l    AHIST_M8S
  1425. ahi_sta    dc.l    0            ; start
  1426. ahi_len    dc.l    -1                ; len
  1427.  
  1428. AHI_VOLBOOST:
  1429.         dc.l    Ahiet_MasterVolume
  1430. AHIBoost
  1431.         dc.l    $10000
  1432.         dc.l    TAG_DONE
  1433.  
  1434.  
  1435. AHI_DSPEFF:
  1436.     dc.l    AHIET_DSPECHO    ; ahie_Effect
  1437.  
  1438. DSPECHODELAY
  1439.     dc.l    0        ; ahiede_Delay
  1440.  
  1441. DSPECHOFEEDBACK
  1442.     dc.l    $8000            ; ahiede_Feedback
  1443.  
  1444. DSPECHOMIX
  1445.     dc.l    $8000            ; ahiede_Mix
  1446.  
  1447. DSPECHOCROSS
  1448.     dc.l    $10000           ; ahiede_Cross
  1449.     dc.l    TAG_DONE
  1450.  
  1451.  
  1452.  
  1453.  
  1454. PlayerFunc:
  1455.         blk.b    MLN_SIZE
  1456.         dc.l    mmusic
  1457.         dc.l    0
  1458.         dc.l    0
  1459.  
  1460. SoundFunc:
  1461.         blk.b    MLN_SIZE
  1462.         dc.l    soundfunc2
  1463.         dc.l    0
  1464.         dc.l    0
  1465.  
  1466.  
  1467. ;in:
  1468. * a0        struct Hook *                  
  1469. * a1        struct AHISoundMessage *         
  1470. * a2        struct AHIAudioCtrl *           
  1471.  
  1472.  
  1473. soundfunc2:
  1474.     movem.l    d2-d7/a2-a6,-(sp)
  1475.     moveq    #0,d0
  1476.     move.w    ahism_Channel(a1),d0
  1477.     lea    ahi_channels,a0
  1478.     lsl.w    #2,d0
  1479.     move.w    2(a0,d0.w),d1
  1480.     and.w    #$00ff,d1
  1481.     move.w    (a0,d0.w),d7
  1482.     lsl.l    #4,d1
  1483.  
  1484.  
  1485.     lea    ahi_samples,a0
  1486.     move.l    (a0,d1.w),d2            ;sample start
  1487.     cmp.l    #0,Ahi_Sound0
  1488.     beq.s    .no16bit_1
  1489.     lsr.l    #1,d2
  1490. .no16bit_1
  1491.  
  1492.     tst.w    NoLoopEnable
  1493.     beq.s    .noloop1
  1494.     moveq    #0,d3
  1495.     bra.s    .noloop2
  1496. .noloop1
  1497.  
  1498.     add.l    8(a0,d7.w),d2            ;repeat start
  1499.     move.l    12(a0,d7.w),d3            ;repeat length
  1500.  
  1501. .noloop2
  1502.  
  1503.     moveq    #0,d4                ;NOTE: AHISF_IMM *NOT* SET!!
  1504. ;----------------------------
  1505.     lea    LoopTab,a0
  1506.     move.w    d7,d1
  1507.     moveq    #0,d7
  1508.     lsr.w    #4,d1
  1509.     btst    #1,(a0,d1.w)
  1510.     beq.s    .nopingpong
  1511.     moveq    #0,d4
  1512.     lea    ahi_channels,a0
  1513.     move.b    2(a0,d0.w),d4
  1514.     subq.w    #1,d4
  1515.     muls    #-1,d4
  1516.     move.b    d4,2(a0,d0.w)
  1517.     moveq    #1,d7
  1518. .nopingpong
  1519. ;----------------------------
  1520.  
  1521.     lsr.l    #2,d0                ; chnnum
  1522.     moveq    #0,d1                ;sample bank
  1523.  
  1524.     tst.l    d3
  1525.     beq.w    .length_0
  1526.  
  1527.     tst.w    d7                ; gdy ping pong loop
  1528.     bne.w    .pingpongproc
  1529.  
  1530.     cmp.w    #32,d0                ; tylko dla 32 kanalow
  1531.     bgt.w    .length_ok
  1532.     cmp.l    #512,d3
  1533.     bge.w    .length_ok
  1534.  
  1535.     cmp.l    #0,Ahi_Sound0            ; gdy 16 bit to olewa i skacze do proc2
  1536.     bne.s    .16bitproc
  1537.  
  1538. .8bitproc:
  1539.     movem.l    d0-d1/d4-a2,-(sp)
  1540.  
  1541.     lea    SamBuff,a0
  1542.     mulu    #1024+[16],d0
  1543.     add.w    d0,a0
  1544.  
  1545.     cmp.l    (a0),d2
  1546.     bne.s    .notakedata
  1547.     cmp.l    4(a0),d3
  1548.     beq.s    .takedata
  1549. .notakedata
  1550.     move.l    d2,(a0)
  1551.     move.l    d3,4(a0)
  1552.  
  1553.     add.l    #16,a0
  1554.     move.l    d2,a1
  1555.     move.l    a0,d2
  1556.     move.l    d2,-8(a0)
  1557.  
  1558.     move.l    d3,d7
  1559.     move.l    #1024,d6
  1560.     divu    d7,d6
  1561.     and.l    #$ffff,d6
  1562.     move.l    d7,d3
  1563.     mulu    d6,d3
  1564.     move.l    d3,-4(a0)
  1565.  
  1566.     subq    #1,d6
  1567.     subq    #1,d7
  1568.     move.l    a1,d4
  1569.     move.l    d7,d5
  1570. .makebuffloopM
  1571.     move.l    d4,a1
  1572.     move.l    d5,d7
  1573. .makebuff
  1574.     move.b    (a1)+,(a0)+
  1575.     dbf    d7,.makebuff
  1576.     dbf    d6,.makebuffloopM
  1577.     bra.s    .makebuffdone
  1578. .takedata
  1579.     move.l    8(a0),d2
  1580.     move.l    12(a0),d3
  1581. .makebuffdone
  1582.     movem.l    (sp)+,d0-d1/d4-a2
  1583.     bra.w    .length_ok
  1584.  
  1585.  
  1586.  
  1587.  
  1588.  
  1589. .16bitproc:
  1590.     cmp.l    #512/2,d3
  1591.     bge.w    .length_ok
  1592.  
  1593.     movem.l    d0-d1/d4-a2,-(sp)
  1594.  
  1595.     lea    SamBuff,a0
  1596.     mulu    #1024+[16],d0
  1597.     add.w    d0,a0
  1598.  
  1599.     cmp.l    (a0),d2
  1600.     bne.s    .notakedata16
  1601.     cmp.l    4(a0),d3
  1602.     beq.s    .takedata16
  1603. .notakedata16
  1604.     move.l    d2,(a0)
  1605.     move.l    d3,4(a0)
  1606.  
  1607.     add.l    #16,a0
  1608.     move.l    d2,a1
  1609.     add.l    d2,a1
  1610.     move.l    a0,d2
  1611.     move.l    d2,-8(a0)
  1612.  
  1613.     move.l    d3,d7
  1614.     move.l    #1024/2,d6
  1615.     divu    d7,d6
  1616.     and.l    #$ffff,d6
  1617.     move.l    d7,d3
  1618.     mulu    d6,d3
  1619.     move.l    d3,-4(a0)
  1620.  
  1621.     subq    #1,d6
  1622.     subq    #1,d7
  1623.     move.l    a1,d4
  1624.     move.l    d7,d5
  1625. .makebuffloopM16
  1626.     move.l    d4,a1
  1627.     move.l    d5,d7
  1628. .makebuff16
  1629.     move.w    (a1)+,(a0)+
  1630.     dbf    d7,.makebuff16
  1631.     dbf    d6,.makebuffloopM16
  1632.     bra.s    .makebuffdone16
  1633. .takedata16
  1634.     move.l    8(a0),d2
  1635.     move.l    12(a0),d3
  1636. .makebuffdone16
  1637.     cmp.l    #0,Ahi_Sound0
  1638.     beq.s    .no16bit_2
  1639.     lsr.l    #1,d2
  1640. .no16bit_2
  1641.     movem.l    (sp)+,d0-d1/d4-a2
  1642.     bra.w    .length_ok
  1643.  
  1644.  
  1645.  
  1646.  
  1647.  
  1648. .pingpongproc:
  1649.     cmp.w    #32,d0                ; tylko dla 32 kanalow
  1650.     bgt.w    .length_ok
  1651.     cmp.l    #512/2,d3            ; ping pong musi miec parzyste
  1652.     bge.w    .length_ok
  1653.  
  1654.  
  1655.     cmp.l    #0,Ahi_Sound0            ; gdy 16 bit to olewa i skacze do proc2
  1656.     bne.w    .16bitprocpp
  1657.  
  1658.  
  1659. .8bitproc_pp:
  1660.     movem.l    d0-d1/d4-a2,-(sp)
  1661.  
  1662.     lea    SamBuff,a0
  1663.     mulu    #1024+[16],d0
  1664.     add.w    d0,a0
  1665.  
  1666.     cmp.l    (a0),d2
  1667.     bne.s    .notakedata_pp
  1668.     cmp.l    4(a0),d3
  1669.     beq.s    .takedata_pp
  1670. .notakedata_pp
  1671.     move.l    d2,(a0)
  1672.     move.l    d3,4(a0)
  1673.  
  1674.     add.l    #16,a0
  1675.     move.l    d2,a1
  1676.     move.l    a0,d2
  1677.     move.l    d2,-8(a0)
  1678.  
  1679.     move.l    d3,d7
  1680.     move.l    #1024,d6
  1681.     divu    d7,d6
  1682.     and.l    #$ffff,d6
  1683.     move.l    d7,d3
  1684.     mulu    d6,d3
  1685.     move.l    d3,-4(a0)
  1686.  
  1687.     lsr.l    #1,d6        ; dziele przez dwa ilosc petli bo jest ping pong
  1688.  
  1689.     subq    #1,d6
  1690.     subq    #1,d7
  1691.     move.l    a1,d4
  1692.     move.l    d7,d5
  1693. .makebuffloopM_pp
  1694.     move.l    d4,a1
  1695.     move.l    d5,d7
  1696. .makebuff_pp
  1697.     move.b    (a1)+,(a0)+
  1698.     dbf    d7,.makebuff_pp
  1699.  
  1700.  
  1701. ;    move.l    d4,a1
  1702.     move.l    d5,d7
  1703. .makebuff_pp2
  1704.     move.b    -(a1),(a0)+
  1705.     dbf    d7,.makebuff_pp2
  1706.  
  1707.  
  1708.     dbf    d6,.makebuffloopM_pp
  1709.     bra.s    .makebuffdone_pp
  1710. .takedata_pp
  1711.     move.l    8(a0),d2
  1712.     move.l    12(a0),d3
  1713. .makebuffdone_pp
  1714.     movem.l    (sp)+,d0-d1/d4-a2
  1715.  
  1716.     moveq    #0,d4
  1717.     bra.w    .length_ok
  1718.  
  1719.  
  1720.  
  1721.  
  1722.  
  1723.  
  1724.  
  1725. .16bitprocpp:
  1726.     cmp.l    #512/2/2,d3
  1727.     bge.w    .length_ok
  1728.  
  1729.     movem.l    d0-d1/d4-a2,-(sp)
  1730.  
  1731.     lea    SamBuff,a0
  1732.     mulu    #1024+[16],d0
  1733.     add.w    d0,a0
  1734.  
  1735.     cmp.l    (a0),d2
  1736.     bne.s    .notakedata16pp
  1737.     cmp.l    4(a0),d3
  1738.     beq.s    .takedata16pp
  1739. .notakedata16pp
  1740.     move.l    d2,(a0)
  1741.     move.l    d3,4(a0)
  1742.  
  1743.     add.l    #16,a0
  1744.     move.l    d2,a1
  1745.     add.l    d2,a1
  1746.     move.l    a0,d2
  1747.     move.l    d2,-8(a0)
  1748.  
  1749.     move.l    d3,d7
  1750.     move.l    #1024/2,d6
  1751.     divu    d7,d6
  1752.     and.l    #$ffff,d6
  1753.     move.l    d7,d3
  1754.     mulu    d6,d3
  1755.     move.l    d3,-4(a0)
  1756.  
  1757.     lsr.l    #1,d6        ; dziele przez dwa ilosc petli bo jest ping pong
  1758.  
  1759.     subq    #1,d6
  1760.     subq    #1,d7
  1761.     move.l    a1,d4
  1762.     move.l    d7,d5
  1763. .makebuffloopM16pp
  1764.  
  1765.  
  1766.     move.l    d4,a1
  1767.     move.l    d5,d7
  1768. .makebuff16pp
  1769.     move.w    (a1)+,(a0)+
  1770.     dbf    d7,.makebuff16pp
  1771.  
  1772. ;    move.l    d4,a1
  1773.     move.l    d5,d7
  1774. .makebuff16pp2
  1775.     move.w    -(a1),(a0)+
  1776.     dbf    d7,.makebuff16pp2
  1777.  
  1778.  
  1779.     dbf    d6,.makebuffloopM16pp
  1780.     bra.s    .makebuffdone16pp
  1781. .takedata16pp
  1782.     move.l    8(a0),d2
  1783.     move.l    12(a0),d3
  1784. .makebuffdone16pp
  1785.     cmp.l    #0,Ahi_Sound0
  1786.     beq.s    .no16bit_2pp
  1787.     lsr.l    #1,d2
  1788. .no16bit_2pp
  1789.     movem.l    (sp)+,d0-d1/d4-a2
  1790.  
  1791.     moveq    #0,d4
  1792.     bra.w    .length_ok
  1793.  
  1794.  
  1795.  
  1796.  
  1797.  
  1798. .length_0
  1799.     moveq    #AHI_NOSOUND,d1
  1800. .length_ok
  1801.  
  1802.     lea    SampleOffsets,a6
  1803.  
  1804.     cmp.l    #AHI_NOSOUND,d1
  1805.     bne.s    .nozero
  1806.     cmp.l    (a6,d0.w*4),d2
  1807.     beq.s    .nozero
  1808.  
  1809. ; --------------------------------------- ;
  1810.     lea    SampleOffsetsFT,a6
  1811.     tst.b    (a6,d0.w)
  1812.     beq.s    .okft1
  1813.     clr.b    (a6,d0.w)
  1814.     bra.s    .nozero
  1815. .okft1
  1816. ; ^-------------------------------------- ;
  1817.  
  1818.     lea    SampleOffsets,a6
  1819.     move.l    #0,(a6,d0.w*4)            ;start
  1820. .nozero
  1821.  
  1822.     cmp.l    #0,(a6,d0.w*4)    
  1823.     beq.s    .zero
  1824.  
  1825.     lea    SampleOffsetsFT,a6
  1826.     tst.b    (a6,d0.w)
  1827.     beq.s    .okft2
  1828.     clr.b    (a6,d0.w)
  1829.     bra.s    .zero
  1830. .okft2
  1831. ; ^-------------------------------------- ;
  1832.     lea    SampleOffsets,a6
  1833.     move.l    d2,(a6,d0.w*4)            ;start
  1834. .zero
  1835.  
  1836.  
  1837.     tst.b    d4
  1838.     beq.s    .nopingpong2
  1839.  
  1840.     subq.l    #1,d3
  1841.     add.l    d3,d2
  1842.     subq.l    #1,d2
  1843.     not.l    d3
  1844.     bra.s    .yapingpong
  1845. .nopingpong2
  1846.     tst.w    d7
  1847.     beq.s    .yapingpong
  1848.     cmp.l    #0,(a6,d0.w*4)    
  1849.     beq.s    .yapingpong
  1850.     add.l    d3,(a6,d0.w*4)            ;start
  1851. .yapingpong
  1852.     moveq    #0,d4                ;NOTE: AHISF_IMM *NOT* SET!!
  1853.     move.l    ahibase(pc),a6
  1854.     jsr    _LVOAHI_SetSound(a6)
  1855.  
  1856.     movem.l    (sp)+,d2-d7/a2-a6
  1857. .exit    rts
  1858.  
  1859.  
  1860. lastinstrnum:    dc.w    0
  1861.  
  1862. mmusic:
  1863.     movem.l    d0-a6,-(sp)
  1864.  
  1865.     bsr.l    db_music
  1866.  
  1867. ;       cmp.w    #1,MIXITENABLE
  1868. ;    bne.s    .ominit
  1869. ;    moveq    #0,d0
  1870. ;    move.w    EndSongPos,d0
  1871. ;    cmp.w    SOngPos,d0
  1872. ;    bne.s    .ominit
  1873. ;
  1874. ;
  1875. ;    moveq    #0,d0
  1876. ;    move.w    SongPos,d0
  1877. ;    add.w    d0,d0
  1878. ;    lea    SongOrders,a0
  1879. ;    move.w    (a0,d0.w),d0
  1880. ;    add.w    d0,d0
  1881. ;    lea    PattLens,a0
  1882. ;    move.w    (a0,d0.w),d0
  1883. ;    subq    #1,d0
  1884. ;
  1885. ;    moveq    #0,d1
  1886. ;    move.w    PattPos,d1
  1887. ;    cmp.w    d0,d1
  1888. ;    bne.s    .ominit
  1889. ;    move.w    #1,StopITNOW
  1890. ;.ominit
  1891.     tst.w    StopEnable
  1892.     beq.s    No_clr_volumes
  1893.     bsr    stop_play
  1894. No_clr_volumes
  1895.     movem.l    (sp)+,d0-a6
  1896.     rts
  1897.  
  1898. clr_volumes:
  1899.     moveq    #0,d0
  1900.     moveq    #0,d1
  1901.     move.w    TrackNumber,d7
  1902.     subq    #1,d7
  1903. init_vols
  1904.     movem.l    d0-a6,-(sp)
  1905.     bsr.l    ahi_volume
  1906.     movem.l    (sp)+,d0-a6
  1907.     addq    #1,d0
  1908.     dbf    d7,init_vols
  1909.     rts
  1910.  
  1911. stop_play:
  1912.     clr.w    StopEnable
  1913.     moveq    #0,d0
  1914.     moveq    #0,d1
  1915.     move.w    TrackNumber,d7
  1916.     subq    #1,d7
  1917. clr_vols
  1918.     movem.l    d0-a6,-(sp)
  1919.     moveq    #AHISF_IMM,d4
  1920.     moveq    #AHI_NOSOUND,d1
  1921.     move.l    ahibase,a6
  1922.     move.l    ahi_ctrl,a2
  1923.     jsr    _LVOAHI_SetSound(a6)
  1924.     movem.l    (sp)+,d0-a6
  1925.     addq    #1,d0
  1926.     dbf    d7,clr_vols
  1927.     rts
  1928.  
  1929.  
  1930. FreeShortSamBuff:
  1931.     movem.l    d0-a6,-(sp)
  1932.     lea    SamBuff,a0
  1933.     moveq    #32-1,d7
  1934. .freeshortsambuffloop
  1935.     clr.l    (a0)
  1936.     clr.l    4(a0)
  1937.     add.l    #1024+16,a0
  1938.     dbf    d7,.freeshortsambuffloop
  1939.     movem.l    (sp)+,d0-a6
  1940.     rts
  1941.  
  1942. ahi_init:
  1943. .retry    bsr.l    ahi_initmain
  1944.     tst.l    d0
  1945.     beq.s    .ok
  1946.     bsr.l    OpenAhiError2
  1947.     bra    .retry
  1948. .ok    rts
  1949.  
  1950.  
  1951. ahi_initstart:
  1952.     bsr.l    ahi_initmain
  1953.     rts
  1954.  
  1955. ahi_initmain:
  1956.     OPENAHI 1
  1957.     move.l    d0,ahibase
  1958.     beq.w    ahi_eror_at_start
  1959.  
  1960.     move.l    d0,a6
  1961.     lea    ahi_tags(pc),a1
  1962.     jsr    _LVOAHI_AllocAudioA(a6)
  1963.     move.l    d0,ahi_ctrl
  1964.     beq.w    ahi_eror
  1965.  
  1966.     move.l    d0,a2
  1967.     moveq    #0,d0                ;Load module as one sound!
  1968.     moveq    #AHIST_SAMPLE,d1
  1969.     lea    ahi_sound0(pc),a0
  1970.     jsr    _LVOAHI_LoadSound(a6)
  1971.     tst.l    d0
  1972.     bne.w    ahi_eror_allocaudio_ok
  1973.  
  1974.     lea    ahi_ctrltags(pc),a1
  1975.     jsr    _LVOAHI_ControlAudioA(a6)
  1976.     tst.l    d0
  1977.     bne.w    ahi_eror_allocaudio_ok
  1978.  
  1979.     move.w    CiaTempo,d7
  1980.  
  1981.     movem.l    d0-d6/a0-a6,-(sp)
  1982.     moveq    #0,d0
  1983.     moveq    #0,d1
  1984.     move.w    RealTempo,d0
  1985.     move.w    d7,d1
  1986.     lsl.l    #8,d0
  1987.     divu    #125,d0
  1988.     and.l    #$ffff,d0
  1989.     mulu    d0,d1
  1990.     lsr.l    #8,d1
  1991.     move.w    d1,d7
  1992.     movem.l    (sp)+,d0-d6/a0-a6
  1993.  
  1994.     and.l    #$ffff,d7
  1995.     lsl.w    #1,d7
  1996.     divu    #5,d7
  1997.     and.l    #$ffff,d7
  1998.     swap    d7
  1999.     move.l    d7,afreq
  2000.  
  2001.     move.l    ahibase(pc),a6
  2002.     lea    atags(pc),a1
  2003.     move.l    ahi_ctrl(pc),a2
  2004.     jsr    _LVOAHI_ControlAudioA(a6)
  2005.  
  2006.     move.l    ahibase,a6
  2007.     move.l    #AHI_VOLBOOST,a0
  2008.  
  2009.     tst.w    AutoBoostEn
  2010.     beq.s    .nieauto
  2011.  
  2012.     move.l    20(a6),d0
  2013.     cmp.l    #$40063,d0
  2014.     blt.s    .nieauto
  2015.  
  2016.     moveq    #0,d0
  2017.     move.w    TrackNumber,d0
  2018.     mulu    #$4000,d0
  2019.     tst.w    MixItEnable
  2020.     bne.s    .nieauto
  2021.     move.l    d0,AhiBoost
  2022. .nieauto
  2023.     move.l    ahi_ctrl,a2
  2024.     jsr    _LVOAHI_Seteffect(a6)
  2025.  
  2026.     movem.l    d0-a6,-(sp)
  2027.     jsr    UpdateEffects
  2028.     movem.l    (sp)+,d0-a6
  2029.  
  2030.     moveq    #0,d0
  2031.     rts
  2032.  
  2033. ahi_eror_at_start:
  2034.     CLOSEAHI
  2035.     moveq    #-1,d0
  2036.     rts
  2037.  
  2038. ahi_eror:
  2039.     CLOSEAHI
  2040.     moveq    #-1,d0
  2041.     rts
  2042.  
  2043.  
  2044. ahi_eror_allocaudio_ok:
  2045.     move.l    ahibase(pc),d0
  2046.     beq.w    .exit
  2047.     move.l    ahibase(pc),d0
  2048.     move.l    d0,a6
  2049.     move.l    ahi_ctrl(pc),a2
  2050.     jsr    _LVOAHI_FreeAudio(a6)
  2051.  
  2052.     CLOSEAHI
  2053. .exit
  2054.     moveq    #-1,d0
  2055.     rts
  2056.  
  2057. ahi_end:
  2058.     move.l    ahibase(pc),d0
  2059.     beq.w    .exit
  2060.  
  2061.     move.l    ahibase(pc),a6
  2062.     lea    AHI_VOLBOOST,a0
  2063.     or.l    #AHIET_CANCEL,ahie_Effect(a0)
  2064.     move.l    ahi_ctrl(pc),a2
  2065.     jsr    _LVOAHI_Seteffect(a6)
  2066.     lea    AHI_VOLBOOST,a0
  2067.     eor.l    #AHIET_CANCEL,ahie_Effect(a0)
  2068.  
  2069.     bsr    EchoOff
  2070.  
  2071.     move.l    ahibase(pc),d0
  2072.     move.l    d0,a6
  2073.     move.l    ahi_ctrl(pc),a2
  2074.     jsr    _LVOAHI_FreeAudio(a6)
  2075.  
  2076.     CLOSEAHI
  2077.  
  2078.  
  2079.     lea    channel1,a0
  2080.     move.w    TrackNumber,d7
  2081.     subq    #1,d7
  2082. .clr    clr.w    MainVol(a0)
  2083.     clr.w    MainPeriod(a0)
  2084.     lea    ChanArea(a0),a0
  2085.     dbf    d7,.Clr
  2086.  
  2087. .exit
  2088.     rts
  2089.  
  2090.  
  2091.  
  2092. EchoEn:        dc.w    0
  2093.  
  2094. EchoON:
  2095. ; ---------------------------------------;
  2096.     move.w    Ahi_Chan+2,d7
  2097.     move.w    d7,mask1channels
  2098.  
  2099.     lea    mask1channels+2,a0
  2100.     subq    #1,d7
  2101. .test
  2102.     cmp.b    #AHIEDM_WET,(a0)+
  2103.     beq.s    .mam
  2104.     dbf    d7,.test
  2105.     tst.w    EchoEn
  2106.     bne.s    EchoOffMain
  2107.     rts
  2108. .mam
  2109. ; ---------------------------------------;
  2110.     clr.w    EchoEn
  2111.     move.l    ahibase,a6
  2112.     lea    mask1struct(pc),a0
  2113.     move.l    ahi_ctrl,a2
  2114.     jsr    _LVOAHI_Seteffect(a6)
  2115.  
  2116.  
  2117.     move.l    ahibase,a6
  2118.     move.l    #AHI_DSPEFF,a0
  2119.     move.l    ahi_ctrl,a2
  2120.     jsr    _LVOAHI_Seteffect(a6)
  2121.     rts
  2122.  
  2123.  
  2124.  
  2125.  
  2126.  
  2127.  
  2128.  
  2129.  
  2130. EchoOFF:
  2131. ; ---------------------------------------;
  2132.     move.w    Ahi_Chan+2,d7
  2133.     move.w    d7,mask1channels
  2134.  
  2135.     lea    mask1channels+2,a0
  2136.     subq    #1,d7
  2137. .test
  2138.     cmp.b    #AHIEDM_WET,(a0)+
  2139.     beq.s    .mam
  2140.     dbf    d7,.test
  2141.     rts
  2142. .mam
  2143. ; ---------------------------------------;
  2144. EchoOffMain
  2145.     clr.w    EchoEn
  2146.     move.l    ahibase(pc),a6
  2147.     lea    mask1struct(pc),a0
  2148.     or.l    #AHIET_CANCEL,ahie_Effect(a0)
  2149.     move.l    ahi_ctrl(pc),a2
  2150.     jsr    _LVOAHI_Seteffect(a6)
  2151.     lea    mask1struct(pc),a0
  2152.     eor.l    #AHIET_CANCEL,ahie_Effect(a0)
  2153.  
  2154.     move.l    ahibase(pc),a6
  2155.     lea    AHI_DSPEFF,a0
  2156.     or.l    #AHIET_CANCEL,ahie_Effect(a0)
  2157.     move.l    ahi_ctrl(pc),a2
  2158.     jsr    _LVOAHI_Seteffect(a6)
  2159.     lea    AHI_DSPEFF,a0
  2160.     eor.l    #AHIET_CANCEL,ahie_Effect(a0)
  2161.     rts
  2162.  
  2163.  
  2164. mask1struct
  2165.     dc.l    AHIET_DSPMASK
  2166. mask1channels
  2167.     dc.w    0
  2168.     blk.b    128,AHIEDM_DRY
  2169.     dc.l    TAG_DONE
  2170.  
  2171.  
  2172.  
  2173.  
  2174.  
  2175. db_init:
  2176.     move.w    GeneralTempo,CiaTempo
  2177.     moveq    #0,d0
  2178.     move.w    GeneralSpeed,d0
  2179.     move.b    d0,Orgtemp
  2180.  
  2181.     clr.w    SongPos
  2182.     clr.w    PattPos
  2183.     clr.b    Count
  2184.  
  2185.     bset    #1,$bfe001
  2186.     move.b    Orgtemp,Count
  2187.     rts
  2188.  
  2189.     
  2190. SongPos:    dc.w    0
  2191. PattPos:    dc.w    0
  2192. OldPattPos:    dc.w    0
  2193.  
  2194. OldCPU:        dc.b    0
  2195. temp:        dc.b    0
  2196. count:        dc.b    0
  2197. count2:        dc.b    0
  2198. JMPEN:        dc.b    0
  2199. PauseEn:    dc.b    0
  2200. hisam:        dc.b    0
  2201.         even
  2202.  
  2203. PauseVBL:    dc.w    0
  2204. OldDepAdr:    dc.l    0
  2205. channelenable:    dc.w    0
  2206. MixPeriodA:    dc.w    0
  2207. MixPeriodB:    dc.w    0
  2208. leng:        dc.w    0
  2209. whichchan:    dc.w    0
  2210. CiaTempo:    dc.w    0
  2211. CiaChanged:    dc.w    0
  2212. GlobalVol:    dc.w    64
  2213. OldGlobalVol:    dc.w    0
  2214.  
  2215. ; ------------------- Paremeters --------------
  2216.  
  2217.  
  2218. db_music:
  2219. ; free a0,a2,a3,
  2220.  
  2221.     move.b    count2(pc),d7
  2222.     cmp.b    temp(pc),d7
  2223.     blt.s    .NoNewPos
  2224.     clr.b    count2
  2225. .NoNewPos
  2226.  
  2227.  
  2228.  
  2229.     tst.b    temp
  2230.     beq.s    DepackDone
  2231.  
  2232.     move.b    count(pc),d7
  2233.     cmp.b    temp(pc),d7
  2234.     blt.s    DepackDone
  2235.  
  2236.     moveq    #0,d6
  2237.     moveq    #0,d7
  2238.     move.w    OrdNum,d7
  2239.     move.w    SongPos(pc),d6
  2240.     cmp.w    d6,d7
  2241.     bge.s    NoRepeatSong
  2242.     clr.w    SongPos
  2243.     clr.w    PattPos
  2244. NoRepeatSong:
  2245.  
  2246.     moveq    #0,d7
  2247.     move.w    SongPos(pc),d7
  2248.     lea    SongOrders,a0
  2249.     move.w    (a0,d7.w*2),d7
  2250.     lea    PattAdresses,a1
  2251.     move.l    (a1,d7.w*4),a1
  2252.  
  2253.     move.w    PattPos(pc),d7
  2254.     moveq    #0,d6
  2255.     move.w    TrackNumber,d6
  2256.     mulu    #6,d6
  2257.     mulu    d6,d7
  2258.     add.l    d7,a1
  2259.  
  2260.     lea    UnPackedData,a6
  2261.     move.l    d6,d7
  2262.     lsr.w    #2,d7
  2263.     subq    #1,d7
  2264. CopyDataLoop
  2265.     move.l    (a1)+,(a6)+
  2266.     dbf    d7,CopyDataLoop
  2267.  
  2268. DepackDone
  2269.  
  2270. DB_musicMAIN:
  2271.  
  2272.     lea    UnPackedData,a1
  2273.  
  2274. ***************
  2275.     tst.b    SPAHIENABLE
  2276.     bne.w    ominplaykey
  2277. ***************
  2278.  
  2279.     moveq    #0,d6
  2280.     moveq    #0,d0
  2281.     lea    Channel1,a6
  2282.     moveq    #0,d7
  2283.     move.w    TrackNumber,d7
  2284.     subq    #1,d7
  2285. channelsloopM:
  2286.     movem.l    d0/d7/a6,-(sp)
  2287.  
  2288. ; -------------------------------------------------------
  2289.     move.w    MainVol(a6),d1
  2290.     cmp.w    OldMainVol(a6),d1
  2291.     bne.s    .doit0
  2292.  
  2293.     move.w    GlobalVol(pc),d1
  2294.     cmp.w    OldGlobalVol(pc),d1
  2295.     bne.s    .doit0
  2296.  
  2297.     move.w    MasterVol(pc),d1
  2298.     cmp.w    OldMasterVol(pc),d1
  2299.     bne.s    .doit0
  2300.  
  2301.     move.l    PanPos(a6),d1
  2302.     cmp.l    OldPanPos(a6),d1
  2303.     beq.s    .skip0
  2304. .doit0
  2305.     bsr.w    ahi_volume
  2306.     move.w    MainVol(a6),OldMainVol(a6)
  2307.     move.l    PanPos(a6),OldPanPos(a6)
  2308. .skip0
  2309.  
  2310.     moveq    #0,d1
  2311.     move.w    MainPeriod(a6),d1
  2312.     beq.s    .skip1
  2313.     cmp.w    OldPeriod(a6),d1
  2314.     bne.s    .doit1
  2315.  
  2316.     move.w    RealTempo(pc),d2
  2317.     cmp.w    OldRealTempo(pc),d2
  2318.     beq.s    .skip1
  2319.  
  2320. .doit1
  2321.     bsr    ahi_period
  2322. .skip1
  2323.     move.w    MainPeriod(a6),OldPeriod(a6)
  2324.  
  2325.  
  2326.     lea    SampleOffsets,a4
  2327.     tst.l    (a4,d0.w*4)
  2328.     beq.s    .zero
  2329.  
  2330.     move.l    LastFreq(a6),d2
  2331.  
  2332.     lea    LoopTab,a5
  2333.     move.w    OldD1(a6),d1
  2334.     lsr.w    #2,d1
  2335.     addq    #1,d1
  2336.  
  2337.     lea    ahi_channels,a3
  2338.     move.b    2(a3,d0.w*4),d4
  2339.  
  2340.     btst    #1,(a5,d1.w)
  2341.     beq.s    .nopingpong
  2342.     eor.b    #1,d4
  2343. .nopingpong
  2344.     tst.b    d4
  2345.     beq.s    .add
  2346.     sub.l    d2,(a4,d0.w*4)
  2347.     bra.s    .zero
  2348. .add
  2349.     add.l    d2,(a4,d0.w*4)
  2350.  
  2351. .zero
  2352.     moveq    #0,d1
  2353.     move.w    OldD1(a6),d1
  2354.     bsr    ahi_sample
  2355.  
  2356. ; -------------------------------------------------------
  2357.     movem.l    (sp)+,d0/d7/a6
  2358.     lea    ChanArea(a6),a6
  2359.     addq    #1,d0
  2360.     dbf    d7,ChannelsLoopM
  2361.  
  2362.     move.w    MasterVol(pc),OldMasterVol
  2363.     move.w    GlobalVol(pc),OldGlobalVol
  2364.  
  2365. ***************
  2366.     bra.s    noominplaykey
  2367. ominplaykey
  2368.     clr.b    SPAHIENABLE
  2369. noominplaykey
  2370. ***************
  2371.  
  2372.  
  2373.     move.w    SongPos(pc),OldSPos
  2374.  
  2375.     lea    channel1,a6
  2376.     lea    SamVol,a4
  2377.     bsr    MIXCHAN
  2378.  
  2379.  
  2380. ;    tst.w    EchoEn2
  2381. ;    bne.s    .mam
  2382.     tst.w    EchoEn
  2383.     beq.s    .noEchoChanged
  2384. .mam
  2385.     movem.l    d0-a6,-(sp)
  2386.     bsr.w    EchoOn
  2387.     movem.l    (sp)+,d0-a6
  2388. .noEchoChanged
  2389.  
  2390.     tst.b    temp
  2391.     beq.w    No_new
  2392.  
  2393.     tst.w    PauseVBL
  2394.     beq.s    NoPause
  2395.     move.b    #1,PauseEn
  2396.     subq.w    #1,PauseVBL
  2397. NoPause:
  2398.  
  2399.     move.b    count(pc),d7
  2400.     cmp.b    temp(pc),d7
  2401.     blt.s    NoNEWPos
  2402.     clr.b    count
  2403.  
  2404.     tst.w    PauseVBL
  2405.     bne.s    DoPAUSE
  2406.  
  2407.     addq.w    #1,pattpos
  2408.     clr.b    PauseEn
  2409.  
  2410.     tst.b    temp
  2411.     beq.s    NoNewPos
  2412.  
  2413.     move.l    a0,-(sp)
  2414.     moveq    #0,d7
  2415.     move.w    SongPos(pc),d7
  2416.     lea    SongOrders,a0
  2417.     add.w    d7,d7
  2418.     move.w    (a0,d7.w),d7
  2419.     lsl.w    #1,d7
  2420.     lea    PattLens,a0
  2421.     move.w    (a0,d7.w),d7
  2422.     move.l    (sp)+,a0
  2423.  
  2424.     moveq    #0,d3
  2425.     move.w    PattPos,d3
  2426.     cmp.w    d7,d3
  2427.     blt.s    NoNewPos
  2428. .newpos
  2429.     clr.w    PattPos
  2430.     addq.w    #1,SongPos
  2431. NoNewPos:
  2432.  
  2433. DoPAUSE
  2434.     addq.b    #1,count
  2435.     addq.b    #1,count2
  2436. *
  2437.     tst.w    PlayPattEn
  2438.     beq.s    .ok
  2439.     move.w    OldSpos,d7
  2440.     cmp.w    SongPos(pc),d7
  2441.     beq.s    .ok
  2442.     move.w    d7,SongPos
  2443. .ok
  2444. *
  2445. No_NEW
  2446.     move.w    RealTempo,OldRealTempo
  2447.     rts
  2448.  
  2449.  
  2450. ahi_volume:
  2451.     movem.l    d0-d3/a0-a2/a6,-(sp)
  2452.  
  2453.     moveq    #0,d1
  2454.     move.w    MainVol(a6),d1
  2455.     cmp.l    #$40*256,d1
  2456.     ble.s    .okV1
  2457.     move.l    #$40*256,d1
  2458. .okV1
  2459.  
  2460.     move.w    GlobalVol(pc),d2
  2461.     cmp.w    #$40,d2
  2462.     ble.s    .okV2
  2463.     moveq    #$40,d2
  2464. .okV2
  2465.     mulu.w    d2,d1
  2466.     lsr.l    #6,d1
  2467.  
  2468.     move.w    MasterVol(pc),d2
  2469.     cmp.w    #$40,d2
  2470.     ble.s    .okV3
  2471.     moveq    #$40,d2
  2472. .okV3
  2473.     mulu.w    d2,d1
  2474.     lsr.l    #4,d1
  2475.  
  2476.  
  2477.     move.l    PanPos(a6),d2
  2478.  
  2479.     move.l    ahibase(pc),a6
  2480.  
  2481.     movem.l    d0-a6,-(sp)
  2482.     moveq    #AHISF_IMM,d3
  2483.     move.l    ahi_ctrl,a2
  2484.     jsr    _LVOAHI_SetVol(a6)
  2485.     movem.l    (sp)+,d0-a6
  2486.  
  2487.     movem.l    (sp)+,d0-d3/a0-a2/a6
  2488.     rts
  2489.  
  2490. ahi_period:
  2491.     movem.l    d0-d2/a0-a2/a6,-(sp)
  2492.  
  2493.     move.l    #3546895*4,d2
  2494.     divu.l    d1,d2
  2495.     move.l    d2,d1
  2496.  
  2497.  
  2498.     moveq    #0,d7
  2499.     move.w    RealTempo,d7
  2500.     cmp.w    OldRealTempo,d7
  2501.     bne.s    .doit
  2502.  
  2503.     moveq    #0,d7
  2504.     move.w    Mainperiod(a6),d7
  2505.     cmp.w    OldPeriod(a6),d7
  2506.     beq.w    .nonote
  2507. .doit
  2508.     movem.l    d0/d2-a6,-(sp)
  2509.     move.l    d1,d2
  2510.     moveq    #0,d1
  2511.     move.l    #125,d0
  2512.     move.w    RealTempo,d1
  2513.     lsl.l    #8,d1
  2514.     divu    d0,d1
  2515.     and.l    #$ffff,d1
  2516.     lsr.l    #2,d2
  2517.     mulu.l    d1,d2
  2518.     lsr.l    #6,d2
  2519.     move.l    d2,d1
  2520.     movem.l    (sp)+,d0/d2-a6
  2521.  
  2522.  
  2523.     cmp.l    #2^20,d1
  2524.     ble.s    .ok
  2525.     clr.b    OffEnable(a6)
  2526.     moveq    #AHISF_IMM,d4
  2527.     moveq    #AHI_NOSOUND,d1
  2528.     move.l    ahibase,a6
  2529.     move.l    ahi_ctrl,a2
  2530.     jsr    _LVOAHI_SetSound(a6)
  2531.     bra.s    .exit
  2532. .ok
  2533.  
  2534.     move.l    d1,-(sp)
  2535.     divu    #50,d1
  2536.     and.l    #$ffff,d1
  2537.     mulu    #125,d1
  2538.     divu.w    RealCiaTempo(pc),d1
  2539.     and.l    #$ffff,d1
  2540.     move.l    d1,LastFreq(a6)
  2541.     move.l    (sp)+,d1
  2542.  
  2543.     move.l    ahibase,a6
  2544.     moveq    #AHISF_IMM,d2
  2545.     move.l    ahi_ctrl,a2
  2546.     jsr    _LVOAHI_SetFreq(a6)
  2547. .exit
  2548. .nonote
  2549.  
  2550.     movem.l    (sp)+,d0-d2/a0-a2/a6
  2551.     rts
  2552.  
  2553. RealCiaTempo    dc.w    125
  2554. RealTempo:    dc.w    125
  2555. OldRealTempo:    dc.w    0
  2556. MasterVol:    dc.w    64
  2557. OldMasterVol:    dc.w    0
  2558.  
  2559. ahi_sample:
  2560.     movem.l    d0-d2/a0-a2/a6,-(sp)
  2561.  
  2562.     tst.b    OffEnable(a6)
  2563.     beq.w    .exit
  2564.     clr.b    OffEnable(a6)
  2565.  
  2566.  
  2567.     moveq    #0,d3
  2568.     cmp.w    #$e40,Oldd2(a6)
  2569.     beq.w    .playmain
  2570.     cmp.w    #$e40,Oldd6(a6)
  2571.     beq.w    .playmain
  2572.  
  2573.     move.w    Oldd2(a6),d2
  2574.     lsr.w    #8,d2
  2575.     cmp.b    #3,d2
  2576.     beq.w    .exit
  2577.     cmp.b    #5,d2
  2578.     beq.w    .exit
  2579.     move.w    Oldd6(a6),d6
  2580.     lsr.w    #8,d6
  2581.     cmp.b    #3,d6
  2582.     beq.w    .exit
  2583.     cmp.b    #5,d6
  2584.     beq.w    .exit
  2585.  
  2586. ; ---------------------- calc sam offset
  2587.     moveq    #0,d4
  2588.     moveq    #0,d7
  2589.     move.b    SamOffsetA(a6),d7
  2590.     lsl.w    #8,d7
  2591.     lsl.l    #8,d7
  2592.  
  2593.     cmp.b    #$9,d2
  2594.     bne.s    .nosamoffset1
  2595.     add.l    d7,d4
  2596.     moveq    #0,d7
  2597.     move.w    OldD2(a6),d7
  2598.     and.w    #$00ff,d7
  2599.     lsl.w    #8,d7
  2600.     add.l    d7,d4
  2601.     lsr.w    #8,d7
  2602.     tst.w    d7
  2603.     beq.s    .nosend1
  2604.     move.w    d7,SlideSamOffset(a6)
  2605. .nosend1
  2606.     moveq    #0,d7
  2607. .nosamoffset1
  2608.     cmp.b    #$9,d6
  2609.     bne.s    .nosamoffset2
  2610.     add.l    d7,d4
  2611.     moveq    #0,d7
  2612.     move.w    OldD6(a6),d7
  2613.     and.w    #$00ff,d7
  2614.     lsl.w    #8,d7
  2615.     add.l    d7,d4
  2616.     move.l    d4,d7
  2617.     lsr.l    #8,d7
  2618.     tst.w    d7
  2619.     beq.s    .nosend2
  2620.     move.w    d7,SlideSamOffset(a6)
  2621. .nosend2
  2622. .nosamoffset2
  2623.  
  2624.     moveq    #0,d4
  2625.     move.w    SlideSamOffset(a6),d4
  2626.     lsl.l    #8,d4
  2627. ; --------------------------------------
  2628.  
  2629.  
  2630.     lea    Instruments,a0
  2631.     move.l    d1,d7
  2632.     lsl.w    #2,d7
  2633.     add.l    #16,d7
  2634.     and.l    #$ffff,d7
  2635.  
  2636.     lsr.l    #1,d1
  2637.     moveq    #0,d2
  2638.     move.w    2(a0,d1.w),d2
  2639.  
  2640. ; -------------------------------- do sample cursora
  2641.     cmp.w    InstrNum,d2
  2642.     bne.s    .notthis
  2643.     move.w    d0,ACTCHAN
  2644. .notthis
  2645. ; ----------------------------------------------------
  2646.  
  2647.     subq    #1,d2
  2648.     lsl.l    #2,d2
  2649.     move.l    d2,d1
  2650.  
  2651.     move.l    d1,d2
  2652.     addq.l    #4,d2
  2653.     lsr.l    #2,d2
  2654.     lea    ahi_channels,a0
  2655.     move.l    d2,(a0,d0.l*4)            ;store instr for each channel
  2656.     move.w    d7,(a0,d0.l*4)
  2657.  
  2658.     addq.l    #4,d1
  2659.     lsl.l    #2,d1
  2660.  
  2661.     lea    ahi_samples,a0
  2662.     move.l    (a0,d1.l),d2            ;start
  2663.  
  2664.     cmp.l    #0,Ahi_Sound0
  2665.     beq.s    .no16bit_1
  2666.     lsr.l    #1,d2
  2667. .no16bit_1
  2668.  
  2669.     add.l    d4,d2
  2670.     move.l    4(a0,d1.l),d3            ;length
  2671.  
  2672.     move.l    d7,d1
  2673.  
  2674.  
  2675.     sub.l    d4,d3
  2676.     bgt.s    .NieWyszlo1            ; gdy po dodaniu offsetu end<0 offsam
  2677.  
  2678.     tst.l    12(a0,d1.l)            ; ale gdy sampl jest zapetlony gra go
  2679.     beq.s    .ONEshotSample1
  2680.     move.l    (a0,d1.l),d2
  2681.     cmp.l    #0,Ahi_Sound0
  2682.     beq.s    .no16bit_2
  2683.     lsr.l    #1,d2
  2684. .no16bit_2
  2685.     add.l    8(a0,d1.l),d2
  2686.     move.l    12(a0,d1.l),d3
  2687.     bra.s    .WyszloZapetlenieDONE
  2688. .ONEshotSample1
  2689.     moveq    #AHI_NOSOUND,d1
  2690.     moveq    #AHISF_IMM,d4
  2691.     bra.w    .length_ok
  2692. .NieWyszlo1
  2693.  
  2694.     tst.l    12(a0,d1.l)
  2695.     beq.s    .ONEshotSample2
  2696.     move.l    8(a0,d1.l),d3
  2697.     add.l    12(a0,d1.l),d3
  2698.     sub.l    d4,d3
  2699.     bgt.s    .NieWyszlo2            ; gdy po dodaniu offsetu end<0 offsam
  2700.     move.l    (a0,d1.l),d2
  2701.     cmp.l    #0,Ahi_Sound0
  2702.     beq.s    .no16bit_3
  2703.     lsr.l    #1,d2
  2704. .no16bit_3
  2705.     add.l    8(a0,d1.l),d2
  2706.     move.l    12(a0,d1.l),d3
  2707. .NieWyszlo2
  2708.  
  2709. .ONEshotSample2
  2710.  
  2711. .WyszloZapetlenieDONE
  2712.  
  2713. ; ------------- test backward
  2714.     move.w    Oldd2(a6),d7
  2715.     lsr.w    #4,d7
  2716.     cmp.b    #$e3,d7
  2717.     beq.s    .backwd
  2718.     move.w    Oldd6(a6),d7
  2719.     lsr.w    #4,d7
  2720.     cmp.b    #$e3,d7
  2721.     bne.s    .no_backwd
  2722. .backwd
  2723.     add.l    d3,d2
  2724.     not.l    d3
  2725. .no_backwd
  2726. ; ----------------------------
  2727.  
  2728. .playmain
  2729.     moveq    #0,d1                ;sample bank
  2730.     moveq    #AHISF_IMM,d4
  2731.  
  2732.     lea    SampleOffsets,a6
  2733.     move.l    d2,(a6,d0.w*4)            ;start
  2734.  
  2735.  
  2736.  
  2737.     lea    SampleOffsetsFT,a6
  2738.     move.b    #1,(a6,d0.w)
  2739.  
  2740.  
  2741.     tst.l    d3
  2742.     bne.b    .length_ok            ;length=0 means "no sound"
  2743.     moveq    #AHI_NOSOUND,d1
  2744. .length_ok
  2745.  
  2746.     lea    SampleOffsets,a6
  2747.     cmp.l    #AHI_NOSOUND,d1
  2748.     bne.s    .nozero
  2749.     move.l    #0,(a6,d0.w*4)            ;start
  2750.     lea    SampleOffsetsFT,a6
  2751.     clr.b    (a6,d0.w)
  2752. .nozero
  2753.  
  2754.     move.l    ahibase,a6
  2755.     move.l    ahi_ctrl,a2
  2756.     jsr    _LVOAHI_SetSound(a6)
  2757.  
  2758. .exit    movem.l    (sp)+,d0-d2/a0-a2/a6
  2759.     rts
  2760.  
  2761. MIXCHAN:
  2762.     moveq    #0,d7
  2763.     move.w    TrackNumber,d7
  2764.     subq    #1,d7
  2765.     clr.w    WhichChan
  2766. ChannelsLoop:
  2767.     addq.w    #1,WhichChan
  2768.     move.l    d7,-(sp)
  2769.     move.w    Oldd0(a6),d0
  2770.     move.w    Oldd1(a6),d1
  2771.     move.w    Oldd2(a6),d2
  2772.     move.w    Oldd6(a6),d6
  2773.     bsr    mainPROC
  2774.     move.w    d0,Oldd0(a6)
  2775.     move.w    d1,Oldd1(a6)
  2776.     move.w    d2,Oldd2(a6)
  2777.     move.w    d6,Oldd6(a6)
  2778.     lea    ChanArea(a6),a6
  2779.     addq.w    #6,a1
  2780.     move.l    (sp)+,d7
  2781.     dbf    d7,ChannelsLoop
  2782.     rts
  2783.  
  2784.  
  2785.  
  2786. ************* finetunes **********************************************
  2787.  
  2788. FINETUNES:
  2789.     movem.l    d1-a6,-(sp)
  2790.     lea    SamFin,a2
  2791.     moveq    #0,d4
  2792.     moveq    #0,d3
  2793.     add.w    d7,d7
  2794.     move.l    (a2,d7.w),d4
  2795.     tst.w    d0
  2796.     beq.s    .fintdone
  2797.  
  2798.     move.l    #3579545,d1
  2799.     divu    d0,d1
  2800.     and.l    #$ffff,d1
  2801. .ok8
  2802.     lsl.l    #8,d4
  2803.     beq.s    .ok7
  2804.     move.l    #8363,d2
  2805.     divu    d2,d4
  2806. .ok7    and.l    #$ffff,d4
  2807.  
  2808.     mulu    d4,d1
  2809.     lsr.l    #8,d1
  2810.  
  2811.     move.l    #3579545,d0
  2812.     tst.l    d1
  2813.     bne.s    .ok9
  2814.     moveq    #1,d1
  2815. .ok9
  2816.     divu.l    d1,d0
  2817.  
  2818. .fintdone
  2819.     movem.l    (sp)+,d1-a6
  2820.     move.w    d0,OrgPeriod(a6)
  2821.     rts
  2822.  
  2823. ; -------------- main procedure ----------------------------
  2824. mainPROC:
  2825.     move.w    OldVolA(a6),VolA(a6)
  2826.     move.w    OldVolB(a6),VolB(a6)
  2827.  
  2828.     tst.b    Temp
  2829.     beq.w    NothingToDo ;Old_data
  2830.  
  2831.     move.b    count(pc),d7
  2832.     cmp.b    temp(pc),d7
  2833.     blt    old_data
  2834.  
  2835.     tst.b    PauseEn
  2836.     bne.w    oldperiod_1
  2837.  
  2838.     moveq    #0,d3
  2839.  
  2840.     tst.b    (a1)
  2841.     beq.w    oldperiod_1
  2842.  
  2843.     cmp.b    #$1f,(a1)
  2844.     bne.s    .novolenvoff
  2845.     addq.b    #1,VolEnvOff(a6)
  2846.     addq.b    #1,PanEnvOff(a6)
  2847.     bra.w    oldInstrNum_1
  2848. .novolenvoff
  2849.  
  2850.     clr.w    NoLoopEnable
  2851.     clr.w    OldPeriod(a6)
  2852.  
  2853.     clr.w    VibratoDatasA(a6)
  2854.     clr.w    VibratoDatasB(a6)
  2855.  
  2856.     move.w    2(a1),d7
  2857.     cmp.w    #$ed0,d7
  2858.     beq.s    .ClrEnvDatas
  2859.     and.w    #$fff0,d7
  2860.     cmp.w    #$ed0,d7
  2861.     beq.s    .NoClrEnvDatas
  2862.  
  2863.     move.w    4(a1),d7
  2864.     cmp.w    #$ed0,d7
  2865.     beq.s    .ClrEnvDatas
  2866.     and.w    #$fff0,d7
  2867.     cmp.w    #$ed0,d7
  2868.     beq.s    .NoClrEnvDatas
  2869.     tst.b    1(a1)
  2870.     beq.s    .NoClrEnvDatas
  2871. .ClrEnvDatas
  2872.     clr.b    VolEnvOff(a6)
  2873.     clr.b    VolEnvMode(a6)
  2874.     clr.w    VolEnvTime(a6)
  2875.  
  2876.     clr.b    PanEnvOff(a6)
  2877.     clr.b    PanEnvMode(a6)
  2878.     clr.w    PanEnvTime(a6)
  2879. .NoClrEnvDatas
  2880.     move.b    #1,OffEnable(a6)
  2881.     move.b    #1,EqNewSamA(a6)
  2882.  
  2883.     moveq    #0,d0
  2884.     move.b    (a1),d0
  2885.  
  2886.     move.l    a3,-(sp)
  2887.     lea    Periods,a3
  2888.     moveq    #0,d3
  2889.     move.b    d0,d3
  2890.     lsr.b    #4,d3
  2891.     subq.b    #1,d3
  2892.     mulu    #24,d3
  2893.     and.b    #$0f,d0
  2894.     add.w    d0,d0
  2895.     add.w    d3,d0
  2896.     move.w    (a3,d0.w),d0
  2897.     move.l    (sp)+,a3
  2898.  
  2899.     move.w    2(a1),d7
  2900.     and.w    #$ff00,d7
  2901.     cmp.w    #$300,d7
  2902.     bne.s    NoClrGliss_1
  2903.     clr.w    GlissandoDatasA+4(a6)
  2904. NoClrGliss_1
  2905.     move.w    4(a1),d7
  2906.     and.w    #$ff00,d7
  2907.     cmp.w    #$300,d7
  2908.     bne.s    NoClrGliss_2
  2909.     clr.w    GlissandoDatasB+4(a6)
  2910. NoClrGliss_2
  2911.  
  2912.     cmp.b    #$18,2(a1)
  2913.     beq.s    .NoClrSlideOffset
  2914.     cmp.b    #$18,4(a1)
  2915.     beq.s    .NoClrSlideOffset
  2916.     cmp.w    #$0900,2(a1)
  2917.     beq.s    .NoClrSlideOffset
  2918.     cmp.w    #$0900,4(a1)
  2919.     beq.s    .NoClrSlideOffset
  2920.     clr.w    SlideSamOffset(a6)
  2921. .NoClrSlideOffset
  2922.  
  2923.     move.w    d0,OrgPeriodARP(a6)
  2924.     moveq    #0,d7
  2925.     move.b    1(a1),d7
  2926.     tst.w    d7
  2927.     bne.s    .notakeold
  2928.     moveq    #0,d7
  2929.     move.b    OldInstrNumA(a6),d7
  2930.     moveq    #0,d1
  2931.     move.b    d7,d1
  2932.     subq    #1,d1
  2933.     lsl.w    #2,d1
  2934. .notakeold
  2935.     add.w    d7,d7
  2936.     bsr    FINETUNES
  2937.  
  2938. *********************************************************************
  2939.  
  2940.  
  2941. oldperiod_1:
  2942.     tst.b    1(a1)
  2943.     beq.w    oldInstrNum_1
  2944.     moveq    #0,d1
  2945.     move.b    1(a1),d1
  2946.     move.b    d1,OldInstrNumA(a6)
  2947.     subq    #1,d1
  2948.     moveq    #0,d2
  2949.  
  2950.     move.b    (a4,d1.w),d2
  2951.     lsl.w    #8,d2
  2952.     move.w    d2,VolA(a6)
  2953.  
  2954.  
  2955. ; ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
  2956.     move.l    d0,-(sp)
  2957.     lea    InstrGeneralPan,a0
  2958.     move.w    2(a0,d1.w*2),GeneralPan(a6)
  2959.     move.l    (sp)+,d0
  2960. ; ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
  2961.  
  2962.     lsl.w    #2,d1
  2963. oldInstrNum_1
  2964.  
  2965.     move.w    2(a1),d2
  2966.     move.w    4(a1),d6
  2967.     move.l    d0,-(sp)
  2968.     moveq    #0,d0
  2969.     move.w    d2,d0
  2970.     and.w    #$ff00,d0
  2971.  
  2972.     cmp.w    #$1400,d0
  2973.     bne.s    .onkeyoff1
  2974.     and.w    #$00ff,d2
  2975.     cmp.w    #$f,d2
  2976.     ble.s    .oki1
  2977.     moveq    #$0,d2
  2978.     bra.s    .onkeyoff1
  2979. .oki1
  2980.     and.w    #$000f,d2
  2981.     add.w    #$ec0,d2
  2982. .onkeyoff1
  2983.  
  2984.     moveq    #0,d0
  2985.     move.w    d6,d0
  2986.     and.w    #$ff00,d0
  2987.  
  2988.     cmp.w    #$1400,d0
  2989.     bne.s    .onkeyoff2
  2990.     and.w    #$00ff,d6
  2991.     cmp.w    #$f,d6
  2992.     ble.s    .oki2
  2993.     moveq    #$0,d6
  2994.     bra.s    .onkeyoff2
  2995. .oki2
  2996.     and.w    #$000f,d6
  2997.     add.w    #$ec0,d6
  2998. .onkeyoff2
  2999.     move.l    (sp)+,d0
  3000.  
  3001.  
  3002.     move.l    a5,-(sp)
  3003.     bsr    EffectCommandsA2
  3004.     bsr    EffectCommandsB2
  3005.     move.l    (sp)+,a5
  3006.  
  3007.  
  3008.     tst.b    OnOffChanA(a6)
  3009.     beq.s    No_Stop1
  3010.     move.w    #$e40,d2
  3011.     move.b    #1,OffEnable(a6)
  3012. No_Stop1:
  3013.  
  3014. old_data:
  3015.  
  3016.     move.b    temp(pc),d7
  3017.     subq    #1,d7
  3018.     cmp.b    count(pc),d7
  3019.     bne.s    no_CLReff
  3020.     move.w    d2,d7
  3021.     lsr.w    #8,d7
  3022.     cmp.b    #8,d7
  3023.     beq.s    no_CLReff1
  3024.     cmp.b    #3,d7
  3025.     beq.s    no_CLReff1
  3026.     cmp.b    #4,d7
  3027.     beq.s    no_CLReff1
  3028.     cmp.b    #5,d7
  3029.     beq.s    CLReffSP1
  3030.     TST.b    d7
  3031.     beq.s    no_CLReff1
  3032.  
  3033.     move.w    d2,d7
  3034.     lsr.w    #4,d7
  3035.     cmp.w    #$ec,d7
  3036.     beq.s    no_CLReff1
  3037.     cmp.w    #$e9,d7
  3038.     beq.s    no_CLReff1
  3039.     cmp.w    #$ed,d7
  3040.     beq.s    no_CLReff1
  3041.     moveq    #0,d2
  3042.     bra.s    no_CLReff1
  3043. CLReffSP1:
  3044.     move.w    #$0300,d2
  3045. no_CLReff1
  3046.     move.w    d6,d7
  3047.     lsr.w    #8,d7
  3048.     cmp.b    #3,d7
  3049.     beq.s    no_CLReff2
  3050.     cmp.b    #4,d7
  3051.     beq.s    no_CLReff2
  3052.     cmp.b    #5,d7
  3053.     beq.s    CLReffSP2
  3054.     TST.b    d7
  3055.     beq.s    no_CLReff2
  3056.  
  3057.     move.w    d6,d7
  3058.     lsr.w    #4,d7
  3059.     cmp.w    #$ec,d7
  3060.     beq.s    no_CLReff2
  3061.     cmp.w    #$e9,d7
  3062.     beq.s    no_CLReff2
  3063.     cmp.w    #$ed,d7
  3064.     beq.s    no_CLReff2
  3065.  
  3066.     moveq    #0,d6
  3067.     bra.s    no_CLReff2
  3068. CLReffSP2:
  3069.     move.w    #$0300,d6
  3070. no_CLReff2
  3071.  
  3072. no_CLReff
  3073.  
  3074. nothingtodo
  3075.  
  3076.     move.l    a5,-(sp)
  3077.     bsr    EffectCommandsA
  3078.     bsr    EffectCommandsB
  3079.     move.l    (sp)+,a5
  3080.  
  3081.     move.w    d0,GlissandoDatasA+2(a6)
  3082.     move.w    d0,GlissandoDatasB+2(a6)
  3083.  
  3084.     tst.w    d0
  3085.     beq.s    nothing
  3086.  
  3087. ; -----------------------------------
  3088.     bsr.s    VolumeEnvelope
  3089. ; -----------------------------------
  3090.  
  3091.     move.w    d0,MainPeriod(a6)
  3092.     tst.w    d7
  3093.     bne.s    .onim
  3094.     move.w    VolA(a6),MainVol(a6)
  3095. .onim
  3096.  
  3097.     tst.w    MainVol(a6)
  3098.     beq.s    .noPan
  3099.  
  3100. ; -----------------------------------
  3101.     move.l    #$7fff,d3
  3102.     bsr.w    PanningEnvelope
  3103.  
  3104. ; -----------------------------------------------------
  3105. ;   FinalPan=Pan+(EnvelopePan-32)*(128-Abs(Pan-128))/32;
  3106. ; -----------------------------------------------------
  3107. ;    d3        =     EnvelopePan 0-$10000
  3108. ;    d4        =     GeneralPan 0-256
  3109.  
  3110.     moveq    #0,d4
  3111.     move.w    GeneralPan(a6),d4        ; GeneralPan    0-256
  3112.  
  3113.  
  3114.     movem.l    d5/d6,-(sp)
  3115.     sub.l    #$7fff,d3
  3116.     move.l    d4,d6
  3117.  
  3118.  
  3119.     sub.w    #128,d4
  3120.     tst.w    d4
  3121.     bge.s    .okp1
  3122.     muls    #-1,d4
  3123. .okp1
  3124.     move.l    #128,d5
  3125.     sub.w    d4,d5
  3126.  
  3127.     lsl.l    #8,d5
  3128.     muls.l    d5,d3
  3129.     divs.l    #$7fff,d3
  3130.  
  3131.     
  3132.     lsl.l    #8,d6
  3133.     add.l    d6,d3
  3134.  
  3135.     move.l    d3,PanPos(a6)
  3136.     movem.l    (sp)+,d5/d6
  3137.  
  3138. .noPan
  3139. ; -----------------------------------
  3140.  
  3141.     move.w    VolA(a6),OldVolA(a6)
  3142.     move.w    VolB(a6),OldVolB(a6)
  3143.     rts
  3144.  
  3145.  
  3146. nothing:
  3147.     tst.w    MainPeriod(a6)
  3148.     beq.s    nostopperiod
  3149.     move.w    #-1,MainPeriod(a6)
  3150. nostopperiod
  3151.     rts
  3152.  
  3153.  
  3154.  
  3155. ;- - - - - - - - - - - -  envelopes
  3156. VolumeEnvelope:
  3157.     movem.l    d0-d6/a0-a6,-(sp)
  3158.  
  3159.  
  3160.     lsr.l    #2,d1
  3161.  
  3162. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3163.     lea    LoopTab,a0
  3164.     move.b    1(a0,d1.w),d6
  3165.     lsr.b    #1,d6
  3166. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3167.  
  3168.     lea    VolEnvelope,a0
  3169.     mulu    #134,d1
  3170.     add.w    d1,a0
  3171.  
  3172.     tst.b    VolEnvOff(a6)
  3173.     beq.s    .doenvelope
  3174.     btst.b    #0,(a0)        ; vol env points
  3175.     bne.s    .doenvelope
  3176.     clr.b    VolEnvOff(a6)
  3177.     clr.w    VolA(a6)
  3178.     bra.w    .noenvelope
  3179. .doenvelope
  3180.  
  3181.     btst    #0,(a0)
  3182.     beq.w    .noenvelope
  3183.  
  3184.  
  3185.     lea    6(a0),a1
  3186.     moveq    #0,d0
  3187.     moveq    #0,d1
  3188.     moveq    #0,d2
  3189.     moveq    #0,d3
  3190.     moveq    #0,d4
  3191.     moveq    #0,d5
  3192.     move.b    1(a0),d4    ; vol env points
  3193.     beq.w    .noenvelope
  3194.  
  3195. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3196.     btst    #7,VolEnvMode(a6)
  3197.     beq.s    .noback
  3198.  
  3199.     move.b    3(a0),d5    ; 1st loop point
  3200.     move.w    (a1,d5.w*4),d0
  3201.     cmp.w    VolEnvTime(a6),d0
  3202.     blt.w    .noreach1stpoint
  3203.     bclr    #7,VolEnvMode(a6)
  3204.     bra.s    .noback
  3205. .noreach1stpoint
  3206.  
  3207.     subq.w    #2,VolEnvTime(a6)
  3208. .noback
  3209.  
  3210. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3211.     addq.w    #1,VolEnvTime(a6)
  3212.  
  3213. ;-------- envelope loop -------------
  3214.  
  3215.     btst    #1,VolEnvMode(a6)
  3216.     bne.s    .noloop
  3217.  
  3218.     btst    #2,(a0)
  3219.     beq.s    .noloop
  3220.  
  3221.     move.b    4(a0),d5    ; 2nd loop point
  3222.     move.w    (a1,d5.w*4),d0
  3223.     cmp.w    VolEnvTime(a6),d0
  3224.     bgt.w    .noloop
  3225.  
  3226.     tst.b    VolEnvOff(a6)
  3227.     bne.s    .setloop
  3228.  
  3229. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3230.     tst.b    d6
  3231.     beq.s    .noping
  3232.     bset    #7,VolEnvMode(a6)
  3233.     bra.s    .noloop
  3234. .noping
  3235. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3236.  
  3237.     move.b    3(a0),d5    ; 1st loop point
  3238.     move.w    (a1,d5.w*4),VolEnvTime(a6)
  3239.     bra.s    .noloop
  3240. .setloop
  3241.     bset    #1,VolEnvMode(a6)
  3242.     tst.b    VolEnvOff(a6)
  3243.     beq.s    .noloop
  3244.     subq.b    #1,VolEnvOff(a6)
  3245. .noloop
  3246.  
  3247. ;-------- envelope sustain1 -------------
  3248.  
  3249.     btst    #0,VolEnvMode(a6)
  3250.     bne.s    .nosustain1
  3251.  
  3252.     btst    #1,(a0)
  3253.     beq.s    .nosustain1
  3254.  
  3255.     move.b    2(a0),d5    ; sustain1 point 
  3256.     move.w    (a1,d5.w*4),d0
  3257.  
  3258.     addq    #1,d0
  3259.     cmp.w    VolEnvTime(a6),d0
  3260.     bne.w    .nosustain1
  3261.  
  3262.     tst.b    VolEnvOff(a6)
  3263.     bne.s    .setsustain1
  3264.  
  3265.     move.w    (a1,d5.w*4),VolEnvTime(a6)
  3266.     bra.s    .nosustain1
  3267. .setsustain1
  3268.     bset    #0,VolEnvMode(a6)
  3269.     tst.b    VolEnvOff(a6)
  3270.     beq.s    .nosustain1
  3271.     subq.b    #1,VolEnvOff(a6)
  3272. .nosustain1
  3273.  
  3274. ;-------- envelope sustain2 -------------
  3275.  
  3276.     btst    #2,VolEnvMode(a6)
  3277.     bne.s    .nosustain2
  3278.  
  3279.     btst    #3,(a0)
  3280.     beq.s    .nosustain2
  3281.  
  3282.     move.b    5(a0),d5    ; sustain2 point
  3283.     move.w    (a1,d5.w*4),d0
  3284.  
  3285.     addq    #1,d0
  3286.     cmp.w    VolEnvTime(a6),d0
  3287.     bne.w    .nosustain2
  3288.  
  3289.     tst.b    VolEnvOff(a6)
  3290.     bne.s    .setsustain2
  3291.  
  3292.     move.w    (a1,d5.w*4),VolEnvTime(a6)
  3293.     bra.s    .nosustain2
  3294. .setsustain2
  3295.     bset    #2,VolEnvMode(a6)
  3296.     tst.b    VolEnvOff(a6)
  3297.     beq.s    .nosustain2
  3298.     subq.b    #1,VolEnvOff(a6)
  3299. .nosustain2
  3300.  
  3301. ;---------------------------------------
  3302.  
  3303.  
  3304.  
  3305. .getpoint
  3306.     move.w    (a1),d0
  3307.     cmp.w    VolEnvTime(a6),d0
  3308.     blt.s    .nextpoint
  3309.     tst.w    VolEnvTime(a6)
  3310.     beq.s    .firstpoint
  3311.     bra.s    .thispoint
  3312. .nextpoint
  3313.     addq    #4,a1
  3314.     dbf    d4,.getpoint
  3315.     subq    #1,VolEnvTime(a6)
  3316.     subq    #4,a1
  3317. .thispoint
  3318.     subq    #4,a1
  3319. .firstpoint
  3320.     move.w    (a1),d0        ; time
  3321.     move.w    4(a1),d1
  3322.  
  3323.     move.w    2(a1),d2    ; vol
  3324.     move.w    6(a1),d3
  3325.  
  3326.  
  3327.     sub.w    d2,d3
  3328.     ext.l    d3
  3329.     asl.l    #8,d3
  3330.     sub.w    d0,d1
  3331.     beq.s    .nodiv1
  3332.     divs    d1,d3
  3333. .nodiv1
  3334.     and.l    #$ffff,d3
  3335.     ext.l    d3
  3336.  
  3337.     moveq    #0,d0
  3338.     move.w    (a1),d0            ; time
  3339.     moveq    #0,d1
  3340.     move.w    VolEnvTime(a6),d1
  3341.     tst.l    d3
  3342.     bge.s    .ok1
  3343.     move.w    4(a1),d0        ; time
  3344.     moveq    #0,d5
  3345.     move.w    6(a1),d5
  3346.     lsl.w    #8,d5
  3347.     bra.s    .ok2
  3348. .ok1
  3349.     moveq    #0,d5
  3350.     move.w    2(a1),d5
  3351.     lsl.w    #8,d5
  3352. .ok2
  3353.  
  3354.     sub.w    d0,d1
  3355.     bne.s    .niezero        ; gdy rowne zero czas na envelopa
  3356.  
  3357.     btst    #1,VolEnvMode(a6)
  3358.     beq.s    .niezero
  3359.  
  3360.     move.w    6(a1),d3        ; dobiegl konca (przesyla koncowa
  3361.     lsl.w    #8,d3            ; glosnosc)
  3362.     bra.s    .envelopefinished
  3363. .niezero
  3364.     muls    d1,d3
  3365.     add.w    d5,d3
  3366. .envelopefinished
  3367.  
  3368.     moveq    #0,d4
  3369.     move.w    VolA(a6),d4
  3370.     lsr.l    #6,d4
  3371. ;    divu    #64,d4
  3372. ;    and.l    #$ffff,d4
  3373.     mulu    d3,d4
  3374.     lsr.l    #8,d4
  3375.     move.w    d4,MainVol(a6)
  3376.  
  3377.  
  3378. ;    move.l    muj,a5
  3379. ;    move.w    d4,(a5)+
  3380. ;    move.l    a5,muj
  3381.  
  3382.     moveq    #1,d7
  3383.     bra.s    .envelopedone
  3384. .noenvelope
  3385.     moveq    #0,d7
  3386. .envelopedone
  3387.     movem.l    (sp)+,d0-d6/a0-a6
  3388. ;- - - - - - - - - - - -  envelopes end
  3389.     rts
  3390.  
  3391.  
  3392.  
  3393.  
  3394.  
  3395.  
  3396.  
  3397.  
  3398.  
  3399.  
  3400. ;- - - - - - - - - - - -  envelopes    
  3401.  
  3402. ; ;;;;;;;;;;;; - procedurki do ping pong loopa
  3403.  
  3404. PanningEnvelope:
  3405.     movem.l    d0-d2/d4-d7/a0-a6,-(sp)
  3406.  
  3407.     lsr.l    #2,d1
  3408.  
  3409. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3410.     lea    LoopTab,a0
  3411.     move.b    1(a0,d1.w),d6
  3412.     lsr.b    #1,d6
  3413. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3414.  
  3415.     lea    PanEnvelope,a0
  3416.     mulu    #134,d1
  3417.     add.w    d1,a0
  3418.  
  3419.     tst.b    PanEnvOff(a6)
  3420.     beq.s    .doenvelope
  3421.     btst.b    #0,(a0)        ; Pan env points
  3422.     bne.s    .doenvelope
  3423.     clr.b    PanEnvOff(a6)
  3424.     bra.w    .noenvelope
  3425. .doenvelope
  3426.  
  3427.     btst    #0,(a0)
  3428.     beq.w    .noenvelope
  3429.  
  3430.  
  3431.     lea    6(a0),a1
  3432.     moveq    #0,d0
  3433.     moveq    #0,d1
  3434.     moveq    #0,d2
  3435.     moveq    #0,d3
  3436.     moveq    #0,d4
  3437.     moveq    #0,d5
  3438.     move.b    1(a0),d4    ; Pan env points
  3439.     beq.w    .noenvelope
  3440.  
  3441. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3442.     btst    #7,PanEnvMode(a6)
  3443.     beq.s    .noback
  3444.  
  3445.     move.b    3(a0),d5    ; 1st loop point
  3446.     move.w    (a1,d5.w*4),d0
  3447.     cmp.w    PanEnvTime(a6),d0
  3448.     blt.w    .noreach1stpoint
  3449.     bclr    #7,PanEnvMode(a6)
  3450.     bra.s    .noback
  3451. .noreach1stpoint
  3452.  
  3453.     subq.w    #2,PanEnvTime(a6)
  3454. .noback
  3455.  
  3456. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3457.     addq.w    #1,PanEnvTime(a6)
  3458.  
  3459. ;-------- envelope loop -------------
  3460.  
  3461.     btst    #1,PanEnvMode(a6)
  3462.     bne.s    .noloop
  3463.  
  3464.     btst    #2,(a0)
  3465.     beq.s    .noloop
  3466.  
  3467.     move.b    4(a0),d5    ; 2nd loop point
  3468.     move.w    (a1,d5.w*4),d0
  3469.     cmp.w    PanEnvTime(a6),d0
  3470.     bgt.w    .noloop
  3471.  
  3472.     tst.b    PanEnvOff(a6)
  3473.     bne.s    .setloop
  3474.  
  3475. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3476.     tst.b    d6
  3477.     beq.s    .noping
  3478.     bset    #7,PanEnvMode(a6)
  3479.     bra.s    .noloop
  3480. .noping
  3481. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3482.  
  3483.  
  3484.     move.b    3(a0),d5    ; 1st loop point
  3485.     move.w    (a1,d5.w*4),PanEnvTime(a6)
  3486.     bra.s    .noloop
  3487. .setloop
  3488.     bset    #1,PanEnvMode(a6)
  3489.     tst.b    PanEnvOff(a6)
  3490.     beq.s    .noloop
  3491.     subq.b    #1,PanEnvOff(a6)
  3492. .noloop
  3493.  
  3494. ;-------- envelope sustain1 -------------
  3495.  
  3496.     btst    #0,PanEnvMode(a6)
  3497.     bne.s    .nosustain1
  3498.  
  3499.     btst    #1,(a0)
  3500.     beq.s    .nosustain1
  3501.  
  3502.     move.b    2(a0),d5    ; sustain1 point 
  3503.     move.w    (a1,d5.w*4),d0
  3504.  
  3505.     addq    #1,d0
  3506.     cmp.w    PanEnvTime(a6),d0
  3507.     bne.w    .nosustain1
  3508.  
  3509.     tst.b    PanEnvOff(a6)
  3510.     bne.s    .setsustain1
  3511.  
  3512.     move.w    (a1,d5.w*4),PanEnvTime(a6)
  3513.     bra.s    .nosustain1
  3514. .setsustain1
  3515.     bset    #0,PanEnvMode(a6)
  3516.     tst.b    PanEnvOff(a6)
  3517.     beq.s    .nosustain1
  3518.     subq.b    #1,PanEnvOff(a6)
  3519. .nosustain1
  3520.  
  3521. ;-------- envelope sustain2 -------------
  3522.  
  3523.     btst    #2,PanEnvMode(a6)
  3524.     bne.s    .nosustain2
  3525.  
  3526.     btst    #3,(a0)
  3527.     beq.s    .nosustain2
  3528.  
  3529.     move.b    5(a0),d5    ; sustain2 point
  3530.     move.w    (a1,d5.w*4),d0
  3531.  
  3532.     addq    #1,d0
  3533.     cmp.w    PanEnvTime(a6),d0
  3534.     bne.w    .nosustain2
  3535.  
  3536.     tst.b    PanEnvOff(a6)
  3537.     bne.s    .setsustain2
  3538.  
  3539.     move.w    (a1,d5.w*4),PanEnvTime(a6)
  3540.     bra.s    .nosustain2
  3541. .setsustain2
  3542.     bset    #2,PanEnvMode(a6)
  3543.     tst.b    PanEnvOff(a6)
  3544.     beq.s    .nosustain2
  3545.     subq.b    #1,PanEnvOff(a6)
  3546. .nosustain2
  3547.  
  3548. ;---------------------------------------
  3549.  
  3550.  
  3551.  
  3552. .getpoint
  3553.     move.w    (a1),d0
  3554.     cmp.w    PanEnvTime(a6),d0
  3555.     blt.s    .nextpoint
  3556.     tst.w    PanEnvTime(a6)
  3557.     beq.s    .firstpoint
  3558.     bra.s    .thispoint
  3559. .nextpoint
  3560.     addq    #4,a1
  3561.     dbf    d4,.getpoint
  3562.     subq    #1,PanEnvTime(a6)
  3563.     subq    #4,a1
  3564. .thispoint
  3565.     subq    #4,a1
  3566. .firstpoint
  3567.     move.w    (a1),d0        ; time
  3568.     move.w    4(a1),d1
  3569.  
  3570.  
  3571.     move.w    2(a1),d2    ; Pan
  3572.     move.w    6(a1),d3
  3573.  
  3574.  
  3575.     sub.w    d2,d3
  3576.     ext.l    d3
  3577.     asl.l    #8,d3
  3578.     sub.w    d0,d1
  3579.     beq.s    .nodiv1
  3580.     divs    d1,d3
  3581. .nodiv1
  3582.     and.l    #$ffff,d3
  3583.     ext.l    d3
  3584.  
  3585.     moveq    #0,d0
  3586.     move.w    (a1),d0            ; time
  3587.     moveq    #0,d1
  3588.     move.w    PanEnvTime(a6),d1
  3589.     tst.l    d3
  3590.     bge.s    .ok1
  3591.     move.w    4(a1),d0        ; time
  3592.     moveq    #0,d5
  3593.     move.w    6(a1),d5
  3594.     lsl.w    #8,d5
  3595.     bra.s    .ok2
  3596. .ok1
  3597.     moveq    #0,d5
  3598.     move.w    2(a1),d5
  3599.     lsl.w    #8,d5
  3600. .ok2
  3601.  
  3602.     sub.w    d0,d1
  3603.     bne.s    .niezero        ; gdy rowne zero czas na envelopa
  3604.  
  3605.     btst    #1,PanEnvMode(a6)
  3606.     beq.s    .niezero
  3607.  
  3608.     move.w    6(a1),d3        ; dobiegl konca (przesyla koncowa
  3609.     lsl.w    #8,d3            ; glosnosc)
  3610.     bra.s    .envelopefinished
  3611. .niezero
  3612.     muls    d1,d3
  3613.     add.w    d5,d3
  3614. .envelopefinished
  3615.  
  3616.     moveq    #0,d4
  3617.     lsl.l    #2,d3
  3618.  
  3619. ;    move.l    muj,a5
  3620. ;    move.l    d3,(a5)+
  3621. ;    move.l    a5,muj
  3622.  
  3623. .noenvelope
  3624. .envelopedone
  3625.     movem.l    (sp)+,d0-d2/d4-d7/a0-a6
  3626. ;- - - - - - - - - - - -  envelopes end
  3627.     rts
  3628.  
  3629.  
  3630.  
  3631.  
  3632.  
  3633.  
  3634.  
  3635.  
  3636.  
  3637.  
  3638. ;muj:    dc.l    huj
  3639.  
  3640. ; --------------------------- EffectCommands ---------------------------
  3641.  
  3642. EffectCommandsA2:
  3643. ; effects 9xx, bxx, cxx, dxx, fxx, gxx, lxx, oxx chan A
  3644.  
  3645.     move.w    d2,d7
  3646.     beq    EffComA2exit
  3647.     lsr.w    #8,d7
  3648.     clr.b    channelenable
  3649.     move.w    d2,d3
  3650.  
  3651.     cmp.b    #8,d7
  3652.     beq    Pannings2
  3653.  
  3654.     lea    SamoffsetA(a6),a5
  3655.     cmp.b    #9,d7
  3656.     beq    SampleOffset
  3657.  
  3658.     cmp.b    #$b,d7
  3659.     beq    SongRepeat
  3660.  
  3661.     lea    VolA(a6),a5
  3662.     cmp.b    #$c,d7
  3663.     beq    SetVolume
  3664.  
  3665.     cmp.b    #$10,d7
  3666.     beq    SetGlobalVolume
  3667.  
  3668.     cmp.b    #$15,d7
  3669.     beq    SetEnvelopePos
  3670.  
  3671.     lea    Hex(pc),a5
  3672.     cmp.b    #$d,d7
  3673.     beq    PattBreak
  3674.  
  3675.     cmp.b    #$f,d7
  3676.     beq    SetTempo
  3677.  
  3678.     cmp.b    #$1c,d7
  3679.     beq    SetRealBPM
  3680.  
  3681.     cmp.b    #$1f,d7
  3682.     beq    EchoOnOff
  3683.     cmp.b    #$20,d7
  3684.     beq    SetDelay
  3685.     cmp.b    #$21,d7
  3686.     beq    SetFeedBack
  3687.     cmp.b    #$22,d7
  3688.     beq    SetMix
  3689.     cmp.b    #$23,d7
  3690.     beq    SetCross
  3691.  
  3692.     lea    OldSlideOffsetA(a6),a5
  3693.     cmp.b    #$18,d7
  3694.     beq    SlideOffset
  3695.  
  3696. ; effects E0x, E1x, E2x, E4x, E4x, E6x, E7x, E8x, EAx, EBx EEx chan A
  3697.  
  3698.     cmp.w    #$e00,d3
  3699.     beq.w    OffFilter
  3700.  
  3701.     cmp.w    #$e01,d3
  3702.     beq.w    OnFilter
  3703.  
  3704.     cmp.w    #$e50,d3
  3705.     beq.w    OffChannelA
  3706.  
  3707.     cmp.w    #$e51,d3
  3708.     beq.w    OnChannelA
  3709.  
  3710.     move.w    d2,d7
  3711.     lsr.w    #4,d7
  3712.     move.w    d2,d3
  3713.  
  3714.     cmp.b    #$e1,d7
  3715.     beq.w    FineSlideUp
  3716.  
  3717.     cmp.b    #$e2,d7
  3718.     beq.w    FineSlideDown
  3719.  
  3720.     cmp.b    #$e4,d7
  3721.     beq.w    TurnOffSam
  3722.  
  3723.     lea    loopsdataschanA(a6),a5
  3724.     cmp.b    #$e6,d7
  3725.     beq.w    Loops
  3726.  
  3727.     lea    SamOffsetA(a6),a5
  3728.     cmp.b    #$e7,d7
  3729.     beq    offsets
  3730.  
  3731.     cmp.b    #$e8,d7
  3732.     beq    pannings
  3733.  
  3734.     lea    VolA(a6),a5
  3735.     cmp.b    #$ea,d7
  3736.     beq    FineVolUp
  3737.  
  3738.     cmp.b    #$eb,d7
  3739.     beq    FineVolDown
  3740.  
  3741.     cmp.b    #$ee,d7
  3742.     beq    Pause
  3743.  
  3744. EffComA2exit
  3745.     rts
  3746.  
  3747. EffectCommandsB2:
  3748. ; effects 9xx, bxx, cxx, dxx, fxx, gxx, lxx, oxx chan B
  3749.  
  3750.     move.w    d6,d7
  3751.     beq    EffComB2exit
  3752.     lsr.w    #8,d7
  3753.     move.b    #1,channelenable
  3754.     move.w    d6,d3
  3755.  
  3756.     cmp.b    #8,d7
  3757.     beq    Pannings2
  3758.  
  3759.     lea    SamoffsetB(a6),a5
  3760.     cmp.b    #9,d7
  3761.     beq    SampleOffset
  3762.  
  3763.     cmp.b    #$b,d7
  3764.     beq    SongRepeat
  3765.  
  3766.     lea    VolA(a6),a5
  3767.     cmp.b    #$c,d7
  3768.     beq    SetVolume
  3769.  
  3770.     cmp.b    #$10,d7
  3771.     beq    SetGlobalVolume
  3772.  
  3773.     cmp.b    #$15,d7
  3774.     beq    SetEnvelopePos
  3775.  
  3776.     lea    Hex(pc),a5
  3777.     cmp.b    #$d,d7
  3778.     beq    PattBreak
  3779.  
  3780.     cmp.b    #$f,d7
  3781.     beq    SetTempo
  3782.  
  3783.     cmp.b    #$1c,d7
  3784.     beq    SetRealBPM
  3785.  
  3786.     cmp.b    #$1f,d7
  3787.     beq    EchoOnOff
  3788.     cmp.b    #$20,d7
  3789.     beq    SetDelay
  3790.     cmp.b    #$21,d7
  3791.     beq    SetFeedBack
  3792.     cmp.b    #$22,d7
  3793.     beq    SetMix
  3794.     cmp.b    #$23,d7
  3795.     beq    SetCross
  3796.  
  3797.     lea    OldSlideOffsetB(a6),a5
  3798.     cmp.b    #$18,d7
  3799.     beq    SlideOffset
  3800.  
  3801. ; effects E0x, E1x, E2x, E4x, E4x, E6x, E7x, E8x, EAx, EBx EEx chan B
  3802.  
  3803.     cmp.w    #$e00,d3
  3804.     beq.w    OffFilter
  3805.  
  3806.     cmp.w    #$e01,d3
  3807.     beq.w    OnFilter
  3808.  
  3809.     cmp.w    #$e50,d3
  3810.     beq.w    OffChannelA
  3811.  
  3812.     cmp.w    #$e51,d3
  3813.     beq.w    OnChannelA
  3814.  
  3815.     move.w    d6,d7
  3816.     lsr.w    #4,d7
  3817.     move.w    d6,d3
  3818.  
  3819.     cmp.b    #$e1,d7
  3820.     beq.w    FineSlideUp
  3821.  
  3822.     cmp.b    #$e2,d7
  3823.     beq.w    FineSlideDown
  3824.  
  3825.     cmp.b    #$e4,d7
  3826.     beq.w    TurnOffSam
  3827.  
  3828.     lea    loopsdataschanB(a6),a5
  3829.     cmp.b    #$e6,d7
  3830.     beq.w    Loops
  3831.  
  3832.     lea    SamOffsetA(a6),a5
  3833.     cmp.b    #$e7,d7
  3834.     beq    offsets
  3835.  
  3836.     cmp.b    #$e8,d7
  3837.     beq    pannings
  3838.  
  3839.     lea    VolA(a6),a5
  3840.     cmp.b    #$ea,d7
  3841.     beq    FineVolUp
  3842.  
  3843.     cmp.b    #$eb,d7
  3844.     beq    FineVolDown
  3845.  
  3846.     cmp.b    #$ee,d7
  3847.     beq    Pause
  3848.  
  3849. EffComB2exit
  3850.     rts
  3851.  
  3852.  
  3853.  
  3854.  
  3855. EffectCommandsA:
  3856. ; effects 0xx 1xx, 2xx, 3xx, 4xx, 5xx, 6xx, axx, hxx chan A
  3857.     move.w    d2,d7
  3858.     beq    EffComAexit
  3859.     lsr.w    #8,d7
  3860.     clr.b    channelenable
  3861.     move.w    d2,d3
  3862.  
  3863.     lea    OrgPeriodARP(a6),a5
  3864.     tst.b    d7
  3865.     beq.w    Arpeggio
  3866.  
  3867.     cmp.b    #1,d7
  3868.     beq.w    PortUp
  3869.  
  3870.     cmp.b    #2,d7
  3871.     beq.w    PortDown
  3872.  
  3873.     lea    GlissandoDatasA(a6),a5
  3874.     cmp.b    #3,d7
  3875.     beq.w    Glissando
  3876.  
  3877.     lea    VibratoDatasA(a6),a5
  3878.     cmp.b    #4,d7
  3879.     beq.w    Vibrato
  3880.  
  3881.     cmp.b    #5,d7
  3882.     beq.w    SlideVolGliss
  3883.  
  3884.     cmp.b    #6,d7
  3885.     beq.w    SlideVolVib
  3886.  
  3887.     lea    VolA(a6),a5
  3888.     cmp.b    #$a,d7
  3889.     beq    SlideVolume
  3890.  
  3891.     lea    OldGlobalVolA(a6),a5
  3892.     cmp.b    #$11,d7
  3893.     beq    SlideGlobalVolume
  3894.  
  3895.     lea    SlidePanOldA(a6),a5
  3896.     cmp.b    #$19,d7
  3897.     beq    SlidePan
  3898.  
  3899. ; effects E9x, ECx EDx chan A
  3900.  
  3901.     move.w    d2,d7
  3902.     lsr.w    #4,d7
  3903.     move.w    d2,d3
  3904.  
  3905.     lea    RetraceCntA(a6),a5
  3906.     cmp.b    #$e9,d7
  3907.     beq.w    Retrace
  3908.  
  3909.     lea    VolA(a6),a5
  3910.     cmp.b    #$ec,d7
  3911.     beq    CutSample
  3912.  
  3913.     lea    NoteDelayPeriodA(a6),a5
  3914.     cmp.b    #$ed,d7
  3915.     beq    DelaySample
  3916. EffComAexit
  3917.     rts
  3918.  
  3919.  
  3920. EffectCommandsB:
  3921. ; effects 1xx, 2xx, 3xx, 4xx, 5xx, 6xx, axx, hxx chan B
  3922.     move.w    d6,d7
  3923.     beq    EffComBexit
  3924.     lsr.w    #8,d7
  3925.     move.b    #1,channelenable
  3926.     move.w    d6,d3
  3927.  
  3928.     lea    OrgPeriodARP(a6),a5
  3929.     tst.b    d7
  3930.     beq.w    Arpeggio
  3931.  
  3932.     cmp.b    #1,d7
  3933.     beq.w    PortUp
  3934.  
  3935.     cmp.b    #2,d7
  3936.     beq.w    PortDown
  3937.  
  3938.     lea    GlissandoDatasB(a6),a5
  3939.     cmp.b    #3,d7
  3940.     beq.w    Glissando
  3941.  
  3942.     lea    VibratoDatasB(a6),a5
  3943.     cmp.b    #4,d7
  3944.     beq.w    Vibrato
  3945.  
  3946.     cmp.b    #5,d7
  3947.     beq.w    SlideVolGliss
  3948.  
  3949.     cmp.b    #6,d7
  3950.     beq.w    SlideVolVib
  3951.  
  3952.     lea    VolB(a6),a5    ; musi byc B
  3953.     cmp.b    #$a,d7
  3954.     beq    SlideVolume
  3955.  
  3956.     lea    OldGlobalVolB(a6),a5
  3957.     cmp.b    #$11,d7
  3958.     beq    SlideGlobalVolume
  3959.  
  3960.     lea    SlidePanOldB(a6),a5
  3961.     cmp.b    #$19,d7
  3962.     beq    SlidePan
  3963.  
  3964. ; effects E9x, ECx, EDx chan B
  3965.  
  3966.     move.w    d6,d7
  3967.     lsr.w    #4,d7
  3968.     move.w    d6,d3
  3969.  
  3970.     lea    RetraceCntB(a6),a5
  3971.     cmp.b    #$e9,d7
  3972.     beq.w    Retrace
  3973.  
  3974.     lea    VolA(a6),a5
  3975.     cmp.b    #$ec,d7
  3976.     beq    CutSample
  3977.  
  3978.     lea    NoteDelayPeriodB(a6),a5
  3979.     cmp.b    #$ed,d7
  3980.     beq    DelaySample
  3981. EffComBexit
  3982.     rts
  3983.  
  3984. ;------------------------------ effects -------------------------------------
  3985. TurnOffSam:
  3986.     move.b    #1,OffEnable(a6)
  3987.     rts
  3988.  
  3989. SetEnvelopePos:
  3990.     moveq    #0,d7
  3991.     move.b    d3,d7
  3992.     move.w    d7,VolEnvTime(a6)
  3993.     moveq    #0,d3
  3994.     rts
  3995.  
  3996.  
  3997. ;looppattpos    (a5)      0OFS
  3998. ;loopsongpos    1(a5)     1OFS
  3999. ;loophowmany    2(a5)     2OFS
  4000.  
  4001. _0OFS    equ    0
  4002. _1OFS    equ    2
  4003. _2OFS    equ    1
  4004.  
  4005. loops:
  4006.     cmp.w    #$e60,d3
  4007.     bne.s    no_loop
  4008.     tst.b    _2OFS(a5)
  4009.     bne.s    loops_done
  4010.     moveq    #0,d7
  4011.     move.w    pattpos(pc),d7
  4012.     move.b    d7,(a5)
  4013.  
  4014.     move.w    songpos(pc),_1OFS(a5)
  4015.  
  4016.     bra.s    loops_done
  4017. no_loop
  4018.     tst.b    _2OFS(a5)
  4019.     beq.s    storehowmany
  4020.     subq.b    #1,_2OFS(a5)
  4021.     bne.s    no_done
  4022.     clr.b    (a5)
  4023.     clr.w    _1OFS(a5)
  4024.     clr.b    _2OFS(a5)
  4025.     bra.s    loops_done
  4026. no_done
  4027.     moveq    #0,d7
  4028.     move.b    (a5),d7
  4029.     subq.w    #1,d7
  4030.     move.w    d7,PattPos
  4031.  
  4032.     move.w    _1OFS(a5),songpos
  4033.     bra.s    loops_done
  4034. storehowmany
  4035.     and.b    #$0f,d3
  4036.     move.b    d3,_2OFS(a5)
  4037.  
  4038.     moveq    #0,d7
  4039.     move.b    (a5),d7
  4040.     subq.w    #1,d7
  4041.     move.w    d7,PattPos
  4042.  
  4043.     move.w    _1OFS(a5),songpos
  4044. loops_done
  4045.     rts
  4046.  
  4047. Pause:
  4048.     tst.b    PauseEn
  4049.     bne.s    no_pause
  4050.  
  4051.     moveq    #0,d7
  4052.     move.b    d3,d7
  4053.     and.b    #$0f,d7
  4054.     beq.s    No_pause
  4055.     moveq    #0,d3
  4056.     move.b    Temp(pc),d3
  4057.     mulu    d3,d7
  4058.     addq.w    #1,d7
  4059.     move.w    d7,PauseVBL
  4060. no_pause
  4061.     rts
  4062.  
  4063. SongRepeat:
  4064.     move.w    #-1,pattpos
  4065.     moveq    #0,d7
  4066.     move.b    d3,d7
  4067.     cmp.w    #1024,d7
  4068.     blt.s    songrep_ok
  4069.     move.w    #1024,d7
  4070. songrep_ok
  4071.     move.w    d7,songpos
  4072.     rts
  4073.  
  4074. PattBreak:
  4075.     moveq    #0,d7
  4076.     move.b    d3,d7
  4077.     cmp.w    #99,d7
  4078.     blt.s    patt_ok
  4079.     move.w    #99,d7
  4080. patt_ok
  4081.     cmp.w    #-1,pattpos
  4082.     beq.s    NoAddSP
  4083.     move.l    d0,-(sp)
  4084.     moveq    #0,d0
  4085.     move.w    OrdNum,d0
  4086.     cmp.w    SongPos,d0
  4087.     bne.s    .skip1
  4088.     clr.w    SongPos
  4089.     bra.s    .skip2
  4090. .skip1
  4091.     addq.w    #1,songpos
  4092. .skip2
  4093.     move.l    (sp)+,d0
  4094. NoAddSP
  4095.     move.l    d0,-(sp)
  4096.     moveq    #0,d0
  4097.     move.b    (a5,d7.w),d0
  4098.     move.w    d0,pattpos
  4099.     subq.w    #1,pattpos
  4100.     move.l    (sp)+,d0
  4101.     rts
  4102.  
  4103. SampleOffset:
  4104.     tst.b    d3
  4105.     bne.w    .nozero
  4106.  
  4107. .nozero
  4108.     moveq    #0,d7
  4109.     move.b    (a5),d7
  4110.     lsl.w    #8,d7
  4111.     lsl.l    #8,d7
  4112.     and.w    #$00ff,d3
  4113.     lsl.w    #8,d3
  4114.     add.w    d3,d7
  4115.     tst.b    channelenable
  4116.     bne.s    SamOffsChanB
  4117. ;    add.l    d7,(a2,d1.w)
  4118.     rts
  4119. SamOffsChanB
  4120. ;    add.l    d7,124(a2,d5.w)
  4121.     rts
  4122.  
  4123.  
  4124. offsets:
  4125.     move.b    d3,d7
  4126.     and.b    #$0f,d7
  4127.     move.b    d7,(a5)
  4128.     rts
  4129.  
  4130.  
  4131.  
  4132. pannings:
  4133.     moveq    #0,d7
  4134.     move.b    d3,d7
  4135.     and.b    #$0f,d7
  4136.     mulu    #17,d7
  4137.     lea    GeneralPan(a6),a5
  4138.     move.w    d7,(a5)
  4139.     rts
  4140.  
  4141. pannings2:
  4142.     moveq    #0,d7
  4143.     move.b    d3,d7
  4144.     lea    GeneralPan(a6),a5
  4145.     move.w    d7,(a5)
  4146.     rts
  4147.  
  4148. SlidePan:
  4149.     tst.b    d3
  4150.     bne.s    .NoOldSlidePan
  4151.     move.b    (a5),d3
  4152. .NoOldSlidePan
  4153.     move.b    d3,(a5)
  4154.  
  4155.     moveq    #0,d7
  4156.     move.b    d3,d7
  4157.     cmp.w    #$10,d7
  4158.     blt.s    Pandown
  4159.  
  4160.     lsr.b    #4,d7
  4161.     add.w    d7,GeneralPan(a6)
  4162.     cmp.w    #256,GeneralPan(a6)
  4163.     blt.s    Pandone
  4164.     move.w    #256,GeneralPan(a6)
  4165.     rts
  4166. PanDown
  4167.     sub.w    d7,GeneralPan(a6)
  4168.     tst.w    GeneralPan(a6)
  4169.     bgt.s    Pandone
  4170.     clr.w    GeneralPan(a6)
  4171. Pandone:rts
  4172.  
  4173.  
  4174.  
  4175. SetTempo:
  4176.     moveq    #0,d7
  4177.     move.b    d3,d7
  4178.     tst.w    d7
  4179.     beq.s    .Set
  4180.     cmp.w    #$1f,d7
  4181.     bgt.w    Cia_temp
  4182. .Set
  4183.     move.b    d3,temp
  4184.     move.b    d3,orgtemp
  4185.     move.b    d3,count
  4186.     rts
  4187.  
  4188.  
  4189. SetRealBPM:
  4190.     moveq    #0,d7
  4191.     move.b    d3,d7
  4192.  
  4193.     cmp.w    #$20,d7
  4194.     bge.s    .ok
  4195.     moveq    #$20,d7
  4196. .ok
  4197.  
  4198.     move.w    d7,RealTempo
  4199.  
  4200.     moveq    #0,d7
  4201.     move.w    CiaTempo,d7
  4202.     bsr.w    SetAhiTempo
  4203.  
  4204. ;    move.w    #1,RefreshSlider6en
  4205.     rts
  4206.  
  4207. EchoOnOff
  4208.     cmp.w    #$1f10,d3
  4209.     beq.s    EchoOnAll
  4210.     cmp.w    #$1f11,d3
  4211.     beq.s    EchoOffAll
  4212.     lea    mask1channels+2-1,a5
  4213.     add.w    WhichChan,a5
  4214.  
  4215.     moveq    #0,d7
  4216.     move.b    d3,d7
  4217.  
  4218.     cmp.l    #1,d7
  4219.     bgt.s    .exit
  4220.  
  4221.     cmp.b    (a5),d7
  4222.     beq.s    .exit
  4223.     move.b    d7,(a5)
  4224.     move.w    #1,EchoEn
  4225. .exit
  4226.     rts
  4227.  
  4228.  
  4229. EchoOnAll:
  4230.     lea    mask1channels+2,a5
  4231.     move.l    ahi_chan,d7
  4232.     subq    #1,d7
  4233. .test
  4234.     cmp.b    #AHIEDM_WET,(a5)+
  4235.     beq.s    .niemam
  4236.     move.w    #1,EchoEn
  4237.     move.b    #AHIEDM_WET,-1(a5)
  4238. .niemam
  4239.     dbf    d7,.test
  4240.     rts
  4241.  
  4242. EchoOffAll:
  4243.     lea    mask1channels+2,a5
  4244.     move.l    ahi_chan,d7
  4245.     subq    #1,d7
  4246. .test
  4247.     cmp.b    #AHIEDM_DRY,(a5)+
  4248.     beq.s    .niemam
  4249.     move.w    #1,EchoEn
  4250.     move.b    #AHIEDM_DRY,-1(a5)
  4251. .niemam
  4252.     dbf    d7,.test
  4253.     rts
  4254.  
  4255. SetDelay:
  4256.     moveq    #0,d7
  4257.     move.b    d3,d7
  4258.  
  4259.     move.w    d7,DSPparamtab
  4260.  
  4261. ;    move.w    #1,DSPEchoSignal
  4262.  
  4263.     move.l    Ahi_freq,d7
  4264.     lsl.l    #8,d7
  4265.     divu    #500,d7
  4266.     and.l    #$ffff,d7
  4267.  
  4268.     move.l    d6,-(sp)
  4269.     moveq    #0,d6
  4270.     move.b    d3,d6
  4271.     mulu    d6,d7
  4272.     lsr.l    #8,d7
  4273.     cmp.l    DSPECHODELAY,d7
  4274.     beq.s    .exit
  4275.     move.l    d7,DSPECHODELAY
  4276.     move.w    #1,EchoEn
  4277. .exit
  4278.     move.l    (sp)+,d6
  4279. .skip
  4280.     rts
  4281.  
  4282.  
  4283.  
  4284. SetFeedBack:
  4285.     moveq    #0,d7
  4286.     move.b    d3,d7
  4287.  
  4288.     move.w    d7,DSPparamtab+2
  4289. ;    move.w    #1,DSPEchoSignal
  4290.  
  4291.     mulu    #257,d7
  4292.     cmp.l    #$ffff,d7
  4293.     bne.s    .noffff
  4294.     addq.l    #1,d7
  4295. .noffff
  4296.     cmp.l    DSPECHOFEEDBACK,d7
  4297.     beq.s    .exit
  4298.     move.l    d7,DSPECHOFEEDBACK
  4299.     move.w    #1,EchoEn
  4300. .exit
  4301.     rts
  4302.  
  4303.  
  4304.  
  4305.  
  4306. SetMix:
  4307.     moveq    #0,d7
  4308.     move.b    d3,d7
  4309.  
  4310.     move.w    d7,DSPparamtab+4
  4311. ;    move.w    #1,DSPEchoSignal
  4312.  
  4313.     mulu    #257,d7
  4314.     cmp.l    #$ffff,d7
  4315.     bne.s    .noffff
  4316.     addq.l    #1,d7
  4317. .noffff
  4318.     cmp.l    DSPECHOMIX,d7
  4319.     beq.s    .exit
  4320.     move.l    d7,DSPECHOMIX
  4321.     move.w    #1,EchoEn
  4322. .exit
  4323.     rts
  4324.  
  4325.  
  4326.  
  4327.  
  4328. SetCross:
  4329.     moveq    #0,d7
  4330.     move.b    d3,d7
  4331.  
  4332.     move.w    d7,DSPparamtab+6
  4333. ;    move.w    #1,DSPEchoSignal
  4334.  
  4335.     mulu    #257,d7
  4336.     cmp.l    #$ffff,d7
  4337.     bne.s    .noffff
  4338.     addq.l    #1,d7
  4339. .noffff
  4340.     cmp.l    DSPECHOCROSS,d7
  4341.     beq.s    .exit
  4342.     move.l    d7,DSPECHOCROSS
  4343.     move.w    #1,EchoEn
  4344. .exit
  4345.     rts
  4346.  
  4347.  
  4348.  
  4349.  
  4350.  
  4351. Cia_temp
  4352.  
  4353. SetAHItempo:
  4354.     move.w    d7,CiaTempo
  4355.  
  4356.  
  4357.     movem.l    d0-d6/a0-a6,-(sp)
  4358.     moveq    #0,d0
  4359.     moveq    #0,d1
  4360.     move.w    RealTempo,d0
  4361.     move.w    d7,d1
  4362.     lsl.l    #8,d0
  4363.     divu    #125,d0
  4364.     and.l    #$ffff,d0
  4365.     mulu    d0,d1
  4366.     lsr.l    #8,d1
  4367.     move.w    d1,d7
  4368.     move.w    d7,RealCiaTempo
  4369.     movem.l    (sp)+,d0-d6/a0-a6
  4370.  
  4371.  
  4372.     and.l    #$ffff,d7
  4373.     lsl.w    #1,d7
  4374.     divu    #5,d7
  4375.     and.l    #$ffff,d7
  4376.     swap    d7
  4377.     move.l    d7,afreq
  4378.  
  4379.     movem.l    d0-a6,-(sp)
  4380.     move.l    ahibase(pc),a6
  4381.     lea    atags(pc),a1
  4382.     move.l    ahi_ctrl(pc),a2
  4383.     jsr    _LVOAHI_ControlAudioA(a6)
  4384.     movem.l    (sp)+,d0-a6
  4385.     rts
  4386. atags
  4387.     dc.l    AHIA_PlayerFreq
  4388. afreq    dc.l    50<<16
  4389.     dc.l    TAG_DONE
  4390.  
  4391.  
  4392. OffChannelA:
  4393.     bset    #0,OnOffChanA(a6)
  4394.     rts
  4395. OnChannelA:
  4396.     bclr    #0,OnOffChanA(a6)
  4397.     rts
  4398. OffChannelB:
  4399.     bset    #0,OnOffChanB(a6)
  4400.     rts
  4401. OnChannelB:
  4402.     bclr    #0,OnOffChanB(a6)
  4403.     rts
  4404.  
  4405. OffFilter:
  4406.     bclr    #1,$bfe001
  4407.     rts
  4408. OnFilter:
  4409.     bset    #1,$bfe001
  4410.     rts
  4411.  
  4412.  
  4413.  
  4414. Retrace:
  4415.     cmp.b    #1,count
  4416.     bne.s    retrno_2
  4417.     clr.b    (a5)
  4418. retrno_2
  4419.     moveq    #0,d7
  4420.     move.b    d3,d7
  4421.     and.b    #$0f,d7
  4422.     subq.b    #1,d7
  4423.     cmp.b    (a5),d7
  4424.     bne.s    retrno_1
  4425.  
  4426.     tst.b    channelenable
  4427.     beq.s    retr_chan_a
  4428. ;    move.l    (a0,d5.w),124(a2,d5.w)    ; adres sampla
  4429.     move.b    #1,OffEnable(a6)
  4430.     bra.s    retr_chan_b
  4431. retr_chan_a
  4432.     move.b    #1,OffEnable(a6)
  4433. ;    move.l    (a0,d1.w),(a2,d1.w)    ; adres sampla
  4434. retr_chan_b
  4435.     clr.b    (a5)
  4436.     rts
  4437. retrno_1
  4438.     addq.b    #1,(a5)
  4439. no_retrace_1
  4440.     rts
  4441.  
  4442. cutsample:
  4443.     moveq    #0,d7
  4444.     move.b    d3,d7
  4445.     and.b    #$0f,d7
  4446.     beq.s    .doit
  4447.     cmp.b    count(pc),d7
  4448.     bne.s    no_cut_sam
  4449.  
  4450.  
  4451.     moveq    #0,d7
  4452.     move.b    count,d7
  4453.     cmp.b    temp(pc),d7
  4454.     beq.s    no_cut_sam
  4455.  
  4456. .doit    clr.w    (a5)
  4457. no_cut_sam:
  4458.     rts
  4459.  
  4460.  
  4461. delaysample:
  4462.     moveq    #0,d7
  4463.     move.b    d3,d7
  4464.     and.b    #$0f,d7
  4465.     beq.s    no_delay_sam
  4466.  
  4467.     clr.b    OffEnable(a6)
  4468.  
  4469.     moveq    #0,d7
  4470.     move.b    count2,d7
  4471.     bne.s    .nostore
  4472.     move.w    d0,(a5)
  4473.     move.w    d1,2(a5)
  4474. .nostore
  4475.     move.w    OldD0(a6),d0
  4476.     move.w    OldD1(a6),d1
  4477.  
  4478.     moveq    #0,d7
  4479.     move.b    d3,d7
  4480.     and.b    #$0f,d7
  4481.  
  4482.     cmp.b    count2(pc),d7
  4483.     bne.s    no_delay_sam
  4484.     move.w    (a5),d0
  4485.     move.w    2(a5),d1
  4486.     clr.w    OldPeriod(a6)
  4487.     move.b    #1,OffEnable(a6)
  4488.  
  4489.     clr.b    VolEnvOff(a6)
  4490.     clr.b    VolEnvMode(a6)
  4491.     clr.w    VolEnvTime(a6)
  4492. no_delay_sam:
  4493.     rts
  4494.  
  4495. ; ------------- arpeggio -------------
  4496. arplist:
  4497.     dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1
  4498. Arpeggio:
  4499.     movem.l    d2/a6,-(sp)
  4500.     bsr    ArpeggioMain
  4501.     movem.l    (sp)+,d2/a6
  4502.     move.l    d1,d7
  4503.     lsr.w    #1,d7
  4504.     addq    #2,d7
  4505.     bsr    FINETUNES
  4506.  
  4507.     move.w    d0,VibratoDatasA(a6)
  4508.     move.w    d0,VibratoDatasB(a6)
  4509.     rts
  4510.  
  4511. ArpeggioMain:
  4512.     moveq    #0,d7
  4513.     move.b    count(pc),d7
  4514.     subq.b    #1,d7
  4515.  
  4516.     move.b    arplist(pc,d7.w),d7
  4517.     beq.s    arp0
  4518.     cmp.b    #2,d7
  4519.     beq.s    arp2
  4520.  
  4521. arp1:    moveq    #0,d2
  4522.     move.b    d3,d2
  4523.     lsr.b    #4,d2
  4524.     bra.s    arpdo
  4525.  
  4526. arp2:    moveq    #0,d2
  4527.     move.b    d3,d2
  4528.     and.b    #$f,d2
  4529. arpdo:
  4530.     asl.w    #1,d2
  4531.     move.w    (a5),d7
  4532.     lea    periods,a6
  4533.     moveq    #12*7,d3
  4534. arp3:    cmp.w    (a6)+,d7
  4535.     bge.s    arpfound
  4536.     dbf    d3,arp3
  4537. arp0:
  4538.     tst.b    channelenable
  4539.     bne.s    ARP_chanB1
  4540.     move.w    (a5),d0
  4541.     rts
  4542. ARP_chanB1
  4543.     move.w    (a5),d0
  4544.     rts
  4545. arpfound:
  4546.     add.w    d2,a6
  4547.     cmp.l    #PeriodsEnd,a6
  4548.     ble.s    ArpOk1
  4549.     move.l    #PeriodsEnd,a6
  4550.     moveq    #0,d2
  4551.     bra.s    ArpOk2
  4552. ArpOk1    sub.w    d2,a6
  4553. ArpOk2    tst.b    channelenable
  4554.     bne.s    ARP_chanB2
  4555.     move.w    -2(a6,d2.w),d0
  4556.     rts
  4557. ARP_chanB2
  4558.     move.w    -2(a6,d2.w),d0
  4559.     rts
  4560.  
  4561. ; ------------- portamento up -------------
  4562.  
  4563. PortUp:
  4564.     moveq    #0,d7
  4565.     move.b    d3,d7
  4566.  
  4567.     tst.b    channelenable
  4568.     bne.s    PortUp_chan_b
  4569.     
  4570. PortUp_chan_a
  4571.     tst.b    d7
  4572.     bne.s    NoOldPortUpA
  4573.     move.b    PortUpOldValA(a6),d7
  4574. NoOldPortUpA
  4575.     move.b    d7,PortUpOldValA(a6)
  4576.  
  4577.     move.b    d7,d3
  4578.     and.b    #$f0,d7
  4579.     cmp.b    #$f0,d7
  4580.     beq.w    FineSU
  4581.     move.b    d3,d7
  4582.  
  4583.     lsl.w    #2,d7
  4584.     sub.w    d7,d0
  4585. ;    cmp.w    #113,d0
  4586. ;    bge.s    PortUpOkA
  4587. ;    move.w    #113,d0
  4588. ;PortUpOkA
  4589.     move.w    d0,VibratoDatasA(a6)
  4590.     move.w    d0,VibratoDatasB(a6)
  4591.     rts
  4592.  
  4593. PortUp_chan_b
  4594.     tst.b    d7
  4595.     bne.s    NoOldPortUpB
  4596.     move.b    PortUpOldValB(a6),d7
  4597. NoOldPortUpB
  4598.     move.b    d7,PortUpOldValB(a6)
  4599.     move.b    d7,d3
  4600.     and.b    #$f0,d7
  4601.     cmp.b    #$f0,d7
  4602.     beq.w    FineSU
  4603.     move.b    d3,d7
  4604.  
  4605.     lsl.w    #2,d7
  4606.     sub.w    d7,d0
  4607.  
  4608. ;    cmp.w    #113,d0
  4609. ;    bge.s    PortUpOkB
  4610. ;    move.w    #113,d0
  4611. ;PortUpOkB
  4612. ;    rts
  4613.  
  4614.     move.w    d0,VibratoDatasA(a6)
  4615.     move.w    d0,VibratoDatasB(a6)
  4616. NoPortUp:
  4617.     rts
  4618.  
  4619. ; ------------- portamento down -------------
  4620. PortDown:
  4621.     moveq    #0,d7
  4622.     move.b    d3,d7
  4623.  
  4624.     tst.b    channelenable
  4625.     bne.s    PortDown_chan_b
  4626. PortDown_chan_a
  4627.     tst.b    d7
  4628.     bne.s    NoOldPortDownA
  4629.     move.b    PortDownOldValA(a6),d7
  4630. NoOldPortDownA
  4631.     move.b    d7,PortDownOldValA(a6)
  4632.     move.b    d7,d3
  4633.     and.b    #$f0,d7
  4634.     cmp.b    #$f0,d7
  4635.     beq.w    FineSD
  4636.     move.b    d3,d7
  4637.  
  4638.     lsl.w    #2,d7
  4639.     add.w    d7,d0
  4640. ;    cmp.w    #856,d0
  4641. ;    ble.s    PortDownOkA
  4642. ;    move.w    #856,d0
  4643. ;PortDownOkA
  4644.     move.w    d0,VibratoDatasA(a6)
  4645.     move.w    d0,VibratoDatasB(a6)
  4646.     rts
  4647.  
  4648. PortDown_chan_b
  4649.     tst.b    d7
  4650.     bne.s    NoOldPortDownB
  4651.     move.b    PortDownOldValB(a6),d7
  4652. NoOldPortDownB
  4653.     move.b    d7,PortDownOldValB(a6)
  4654.     move.b    d7,d3
  4655.     and.b    #$f0,d7
  4656.     cmp.b    #$f0,d7
  4657.     beq.w    FineSD
  4658.     move.b    d3,d7
  4659.  
  4660.     lsl.w    #2,d7
  4661.     add.w    d7,d0
  4662. ;    cmp.w    #856,d0
  4663. ;    ble.s    PortDownOkB
  4664. ;    move.w    #856,d0
  4665. ;PortDownOkB
  4666.     move.w    d0,VibratoDatasA(a6)
  4667.     move.w    d0,VibratoDatasB(a6)
  4668. noPortDown:
  4669.     rts
  4670.  
  4671. ; --------------- set global volume  -------------
  4672. SetGlobalVolume:
  4673.     moveq    #0,d7
  4674.     move.b    d3,d7
  4675.     move.w    d7,GlobalVol
  4676.     rts
  4677. ; ------------- slide global volume  -------------
  4678. SlideGlobalVolume:
  4679.     tst.b    d3
  4680.     bne.s    .NoOldSlideVol
  4681.     move.b    (a5),d3    ; Old SlideVolValue
  4682. .NoOldSlideVol
  4683.     move.b    d3,(a5)
  4684.  
  4685.     moveq    #0,d7
  4686.     move.b    d3,d7
  4687.     cmp.w    #$10,d7
  4688.     blt.s    .Voldown
  4689.  
  4690.     moveq    #0,d7
  4691.     move.b    d3,d7
  4692.     lsr.b    #4,d7
  4693.     add.w    d7,GlobalVol
  4694.     cmp.w    #64,GlobalVol
  4695.     blt.s    .Voldone
  4696.     move.w    #64,GlobalVol
  4697.     rts
  4698. .Voldown
  4699.     moveq    #0,d7
  4700.     move.b    d3,d7
  4701.     sub.w    d7,GlobalVol
  4702.     tst.w    GlobalVol
  4703.     bgt.s    .Voldone
  4704.     clr.w    GlobalVol
  4705. .Voldone:
  4706.     rts
  4707.  
  4708. ; ------------- slide offset -------------
  4709. SlideOffset:
  4710.     tst.b    d3
  4711.     bne.s    .NoOldSlide
  4712.     move.b    (a5),d3    ; Old SlideOffset
  4713. .NoOldSlide
  4714.     move.b    d3,(a5)
  4715.  
  4716.     moveq    #0,d7
  4717.     move.b    d3,d7
  4718.     cmp.w    #$10,d7
  4719.     blt.s    .down
  4720.  
  4721.     moveq    #0,d7
  4722.     move.b    d3,d7
  4723.     lsr.b    #4,d7
  4724.     add.w    d7,SlideSamOffset(a6)
  4725.     rts
  4726. .down
  4727.     moveq    #0,d7
  4728.     move.b    d3,d7
  4729.     sub.w    d7,SlideSamOffset(a6)
  4730.     tst.w    SlideSamOffset(a6)
  4731.     bgt.s    .done
  4732.     clr.w    SlideSamOffset(a6)
  4733. .done:
  4734.     rts
  4735.  
  4736. ; --------------- set volume  -------------
  4737. SetVolume:
  4738.     moveq    #0,d7
  4739.     move.b    d3,d7
  4740.     lsl.w    #8,d7
  4741.     move.w    d7,(a5)
  4742.     rts
  4743.  
  4744. ; --------------- slide volume up -------------
  4745. SlideVolume:
  4746.     tst.b    d3
  4747.     bne.s    NoOldSlideVol
  4748.     move.b    2(a5),d3    ; Old SlideVolVolue
  4749. NoOldSlideVol
  4750.     move.b    d3,2(a5)
  4751.  
  4752.     moveq    #0,d7
  4753.     move.b    d3,d7
  4754.     cmp.w    #$10,d7
  4755.     blt.s    Voldown
  4756.  
  4757.     and.b    #$0f,d7
  4758.     cmp.b    #$0f,d7
  4759.     beq.s    FineVol
  4760.     move.b    d3,d7
  4761.     and.b    #$f0,d7
  4762.     cmp.b    #$f0,d7
  4763.     beq.s    FineVol
  4764.  
  4765.     moveq    #0,d7
  4766.     move.b    d3,d7
  4767.     lsr.b    #4,d7
  4768.     lsl.w    #8,d7
  4769.     add.w    d7,VolA(a6)
  4770.     cmp.w    #64*256,VolA(a6)
  4771.     blt.s    Voldone
  4772.     move.w    #64*256,VolA(a6)
  4773.     rts
  4774. Voldown
  4775. ;    and.b    #$f0,d7
  4776.  
  4777.     moveq    #0,d7
  4778.     move.b    d3,d7
  4779.     lsl.w    #8,d7
  4780.     sub.w    d7,VolA(a6)
  4781.     tst.w    VolA(a6)
  4782.     bgt.s    Voldone
  4783.     clr.w    VolA(a6)
  4784. Voldone:rts
  4785.  
  4786.  
  4787. FineVol:
  4788.     cmp.b    #$0f,d7
  4789.     beq.s    .FineUp
  4790.     moveq    #0,d7
  4791.     move.b    d3,d7
  4792.     and.b    #$0f,d7
  4793.     add.w    #$eb0,d7
  4794.     move.w    d7,d3
  4795.     bsr    FineVolDown
  4796.     rts
  4797. .FineUp:
  4798.     moveq    #0,d7
  4799.     move.b    d3,d7
  4800.     lsr.b    #4,d7
  4801.     add.w    #$ea0,d7
  4802.     move.w    d7,d3
  4803.     bsr    FineVolUp
  4804.     rts
  4805.  
  4806. FineSU:
  4807.     moveq    #0,d7
  4808.     move.b    d3,d7
  4809.     and.b    #$0f,d7
  4810. ;    add.w    #$ea0,d7
  4811.     move.w    d7,d3
  4812.     bsr    FineSlideUp
  4813.     rts
  4814. FineSD:
  4815.     moveq    #0,d7
  4816.     move.b    d3,d7
  4817.     and.b    #$0f,d7
  4818. ;    add.w    #$eb0,d7
  4819.     move.w    d7,d3
  4820.     bsr    FineSlideDown
  4821.     rts
  4822.  
  4823.  
  4824. ; --------------- fine slide down -------------
  4825. FineSlideDown:
  4826.     move.w    d3,d7
  4827.     and.w    #$000f,d7
  4828.     lsl.w    #2,d7
  4829.  
  4830.     tst.b    channelenable
  4831.     bne.s    FineSlideDownB
  4832.  
  4833.     add.w    d7,d0
  4834. ;    cmp.w    #856,d0
  4835. ;    ble.s    FineSlideDownOkA
  4836. ;    move.w    #856,d0
  4837. ;FineSlideDownOkA
  4838.     moveq    #0,d2
  4839.  
  4840.     move.w    d0,VibratoDatasA(a6)
  4841.     move.w    d0,VibratoDatasB(a6)
  4842.     rts
  4843.  
  4844. FineSlideDownB
  4845.     add.w    d7,d0
  4846. ;    cmp.w    #856,d0
  4847. ;    ble.s    FineSlideDownOkB
  4848. ;    move.w    #856,d0
  4849. ;FineSlideDownOkB
  4850.     moveq    #0,d6
  4851.     move.w    d0,VibratoDatasA(a6)
  4852.     move.w    d0,VibratoDatasB(a6)
  4853.     rts
  4854.  
  4855. ; --------------- fine slide up -------------
  4856. FineSlideUp:
  4857.     move.w    d3,d7
  4858.     and.w    #$000f,d7
  4859.     lsl.w    #2,d7
  4860.  
  4861.     tst.b    channelenable
  4862.     bne.s    FineSlideUpB
  4863.  
  4864.     sub.w    d7,d0
  4865. ;    cmp.w    #113,d0
  4866. ;    bge.s    FineSlideUpOkA
  4867. ;    move.w    #113,d0
  4868. ;FineSlideUpOkA
  4869.     moveq    #0,d2
  4870.     move.w    d0,VibratoDatasA(a6)
  4871.     move.w    d0,VibratoDatasB(a6)
  4872.     rts
  4873.  
  4874. FineSlideUpB
  4875.     sub.w    d7,d0
  4876.  
  4877. ;    cmp.w    #113,d0
  4878. ;    bge.s    FineSlideUpOkB
  4879. ;    move.w    #113,d0
  4880. ;FineSlideUpOkB
  4881.     moveq    #0,d6
  4882.     move.w    d0,VibratoDatasA(a6)
  4883.     move.w    d0,VibratoDatasB(a6)
  4884.     rts
  4885.  
  4886. ; --------------- fine volume up  -------------
  4887. FineVolUp:
  4888.     move.w    d3,d7
  4889.     and.w    #$000f,d7
  4890.     lsl.w    #8,d7
  4891.     add.w    d7,VolA(a6)
  4892.     cmp.w    #64*256,VolA(a6)
  4893.     blt.s    FVUOK
  4894.     move.w    #64*256,VolA(a6)
  4895. FVUOK
  4896.     tst.b    channelenable
  4897.     bne.s    FVUClrVolB
  4898.     moveq    #0,d2
  4899.     rts
  4900. FVUClrVolB
  4901.     moveq    #0,d6
  4902.     rts
  4903.  
  4904.  
  4905. ; --------------- fine volume down  -------------
  4906. FineVolDown:
  4907.     move.w    d3,d7
  4908.     and.w    #$000f,d7
  4909.     lsl.w    #8,d7
  4910.     sub.w    d7,VolA(a6)
  4911.     tst.w    VolA(a6)
  4912.     bge.s    FVDOK
  4913.     clr.w    VolA(a6)
  4914. FVDOK
  4915.     tst.b    channelenable
  4916.     bne.s    FVDClrVolB
  4917.     moveq    #0,d2
  4918.     rts
  4919. FVDClrVolB
  4920.     moveq    #0,d6
  4921. NoFVD    rts
  4922.  
  4923.  
  4924. ; ------------- glissando -------------
  4925.  
  4926. ;GlissOldValue:         (a5)
  4927. ;GlissEnable:        1(a5)
  4928. ;GlissOldPeriod:    2(a5)
  4929. ;GlissNewPeriod:    4(a5)
  4930.  
  4931. Glissando:
  4932.     move.w    d3,d7
  4933.     tst.b    d3
  4934.     bne.s    NoOLDgliss
  4935.     move.b    (a5),d3
  4936. NoOLDgliss
  4937.  
  4938.     cmp.b    #1,count
  4939.     bne.s    NoStore
  4940.     move.b    d3,(a5)
  4941. NoStore
  4942.     lea    GlissandoDatasA(a6),a5
  4943.  
  4944.     tst.w    2(a5)
  4945.     beq.w    GlissRTS
  4946.  
  4947. ;    tst.b    channelenable
  4948. ;    bne.s    GlissOK1B
  4949.  
  4950. GlissOK1A:
  4951.     tst.w    4(a5)
  4952.     bne.s    GlissOk2
  4953.     move.w    d0,d7
  4954.     move.w    d0,4(a5)
  4955.     move.w    2(a5),d0
  4956.     clr.b    1(a5)
  4957.     cmp.w    d0,d7
  4958.     beq.s    ClrNP
  4959.     bge.w    GlissRTS
  4960.     move.b    #1,1(a5)
  4961.     rts
  4962.  
  4963. ;GlissOK1B:
  4964. ;    tst.w    4(a5)
  4965. ;    bne.s    GlissOk2
  4966. ;    move.w    d4,d7
  4967. ;    move.w    d4,4(a5)
  4968. ;    move.w    2(a5),d4
  4969. ;    clr.b    1(a5)
  4970. ;    cmp.w    d4,d7
  4971. ;    beq.s    ClrNP
  4972. ;    bge.s    GlissRTS
  4973. ;    move.b    #1,1(a5)
  4974. ;    rts
  4975.  
  4976. ClrNP:    clr.w    4(a5)
  4977.     rts
  4978.  
  4979. GlissOk2:
  4980.     move.w    d3,d7
  4981.     and.w    #$0ff,d7
  4982.     tst.w    4(a5)
  4983.     beq.s    Glissrts
  4984.     tst.b    1(a5)
  4985.     bne.s    Glisssub
  4986.     lsl.w    #2,d7
  4987.     add.w    d7,2(a5)
  4988.     move.w    4(a5),d7
  4989.     cmp.w    2(a5),d7
  4990.     bgt.s    GlissOK3
  4991.     move.w    4(a5),2(a5)
  4992.     clr.w    4(a5)
  4993. GlissOK3:
  4994. ;    tst.b    channelenable
  4995. ;    bne.s    GlissChanB
  4996. ;GlissChanA
  4997.     move.w    2(a5),d0
  4998.     move.w    d0,VibratoDatasA(a6)
  4999.     move.w    d0,VibratoDatasB(a6)
  5000.     rts
  5001.  
  5002. ;GlissChanB
  5003. ;    move.w    2(a5),d0
  5004. ;    rts
  5005.  
  5006. Glisssub:
  5007.     lsl.w    #2,d7
  5008.     sub.w    d7,2(a5)
  5009.     move.w    4(a5),d7
  5010.     cmp.w    2(a5),d7
  5011.     blt.s    GlissOK3
  5012.     move.w    4(a5),2(a5)
  5013.     clr.w    4(a5)
  5014.     bra.s    GlissOK3
  5015.  
  5016. Glissrts:
  5017.     rts
  5018.  
  5019. SlideVolGliss:
  5020.     and.w    #$00ff,d3
  5021.     add.w    #$a00,d3
  5022.     tst.b    channelenable
  5023.     bne.s    SlideChanB
  5024.     lea    VolA(a6),a5
  5025.     bra.s    DoSlideChan
  5026. SlideChanB
  5027.     lea    VolB(a6),a5
  5028. DoSlideChan
  5029.     bsr    SlideVolume
  5030.  
  5031.     move.w    #$0300,d3
  5032.     tst.b    channelenable
  5033.     bne.s    GlissBChan
  5034.     lea    GlissandoDatasA(a6),a5
  5035.     tst.w    d2
  5036.     bne.s    .ok
  5037.     move.w    #$0300,d2
  5038. .ok
  5039.     bra.s    DoGlissChan
  5040. GlissBChan
  5041.     tst.w    d6
  5042.     bne.s    .ok
  5043.     move.w    #$0300,d6
  5044. .ok
  5045.     lea    GlissandoDatasB(a6),a5
  5046. DoGlissChan
  5047.     bra    Glissando
  5048.  
  5049.  
  5050. SlideVolVib:
  5051.     and.w    #$00ff,d3
  5052.     add.w    #$a00,d3
  5053.     tst.b    channelenable
  5054.     bne.s    SlideChanBV
  5055.     lea    VolA(a6),a5
  5056.     bra.s    DoSlideChanV
  5057. SlideChanBV
  5058.     lea    VolB(a6),a5
  5059. DoSlideChanV
  5060.     bsr    SlideVolume
  5061.  
  5062.     move.w    #$0400,d3
  5063.     tst.b    channelenable
  5064.     bne.s    VibBChan
  5065.     lea    VibratoDatasA(a6),a5
  5066.     tst.w    d2
  5067.     bne.s    .ok
  5068.     move.w    #$0400,d2
  5069. .ok
  5070.     bra.s    DoVibChan
  5071. VibBChan
  5072.     lea    VibratoDatasB(a6),a5
  5073.     tst.w    d6
  5074.     bne.s    .ok
  5075.     move.w    #$0400,d6
  5076. .ok
  5077. DoVibChan
  5078.     bra    Vibrato
  5079.  
  5080.  
  5081.  
  5082.  
  5083. ;VibPeriod    (a5)
  5084. ;VibValue    2(a5)
  5085. ;ViboldValue    3(a5)
  5086.  
  5087. Vibrato:
  5088.     movem.l    d2/d5,-(sp)
  5089.  
  5090.     move.w    d0,d2
  5091. ;    tst.b    channelenable
  5092. ;    bne.s    VibCHANB1
  5093. ;    move.w    d0,d2
  5094. ;VibCHANB1
  5095.     bsr    VibratoMain
  5096. ;    tst.b    channelenable
  5097. ;    bne.s    VibCHANB2
  5098. ;    move.w    d2,d0
  5099. ;    bra.s    VibMainDone
  5100. ;VibCHANB2
  5101.     move.w    d2,d0
  5102. VibMainDone
  5103.     movem.l    (sp)+,d2/d5
  5104.     rts
  5105.  
  5106. VibratoMain:
  5107.     move.b    Count(pc),d7
  5108.     cmp.b    Temp(pc),d7
  5109.     bne.s    NoNewPeriod
  5110.     tst.w    (a5)
  5111.     bne.s    NoNewPeriod
  5112.     move.w    d2,(a5)
  5113. NoNewPeriod
  5114.     move.w    (a5),d2
  5115.     move.b    temp(pc),d7
  5116.     subq    #1,d7
  5117.     cmp.b    count(pc),d7
  5118.     bne.s    DoVibrato
  5119.     clr.w    (a5)
  5120.     rts
  5121. DoVibrato
  5122.     move.b    d3,d5
  5123.     and.b    #$0f,d5
  5124.     bne.s    NoNew1
  5125.     move.b    3(a5),d5
  5126.     and.b    #$0f,d5
  5127.     add.b    d5,d3
  5128. NoNew1
  5129.     move.b    d3,d5
  5130.     and.b    #$f0,d5
  5131.     bne.s    NoNew2
  5132.     move.b    3(a5),d5
  5133.     and.b    #$f0,d5
  5134.     add.b    d5,d3
  5135. NoNew2
  5136.     move.w    d3,-(sp)
  5137.  
  5138.     move.b    d3,3(a5)
  5139.  
  5140.     move.b    d3,d7
  5141.     move.b    2(a5),d3
  5142.     lsr.w    #2,d3
  5143.     and.w    #$1f,d3
  5144.     moveq    #0,d5
  5145.     move.b    VibSin(pc,d3.w),d5
  5146.     mulu    #5,d5
  5147.     divu    #3,d5
  5148.     and.l    #$ffff,d5
  5149.  
  5150.     move.b    d7,d3
  5151.     and.w    #$f,d3
  5152.     mulu    d3,d5
  5153.     lsr.w    #7,d5
  5154.  
  5155.     tst.b    2(a5)
  5156.     bmi.s    VibSub
  5157.     add.w    d5,d2
  5158.     bra.s    VibNext
  5159. VibSub:
  5160.     sub.w    d5,d2
  5161. VibNext:
  5162.     move.w    d2,d5
  5163.     move.b    d7,d5
  5164.     lsr.w    #2,d5
  5165.     and.w    #$3c,d5
  5166.     add.b    d5,2(a5)
  5167.     move.w    (sp)+,d3
  5168.     rts
  5169.  
  5170. VibSin:
  5171.     dc.b    $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
  5172.     dc.b    $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18
  5173.  
  5174.  
  5175. Hex:
  5176.  dc.b    0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,10,11,12,13,14,15,16,17,18,19
  5177.  dc.b    0,0,0,0,0,0,20,21,22,23,24,25,26,27,28,29,0,0,0,0,0,0,30,31
  5178.  dc.b    32,33,34,35,36,37,38,39,0,0,0,0,0,0,40,41,42,43,44,45,46,47
  5179.  dc.b    48,49,0,0,0,0,0,0,50,51,52,53,54,55,56,57,58,59,0,0,0,0,0,0
  5180.  dc.b    60,61,62,63,64,65,66,67,68,69,0,0,0,0,0,0
  5181.  dc.b    70,71,72,73,74,75,76,77,78,79,0,0,0,0,0,0
  5182.  dc.b    80,81,82,83,84,85,86,87,88,89,0,0,0,0,0,0
  5183.  dc.b    90,91,92,93,94,95,96,97,98,99,0,0,0,0,0,0
  5184.  even
  5185.  
  5186. PERIODS:
  5187.  dc.w    856*16,808*16,762*16,720*16,678*16,640*16,604*16,570*16,538*16,508*16,480*16,453*16
  5188.  dc.w    856*8,808*8,762*8,720*8,678*8,640*8,604*8,570*8,538*8,508*8,480*8,453*8
  5189.  dc.w    856*4,808*4,762*4,720*4,678*4,640*4,604*4,570*4,538*4,508*4,480*4,453*4
  5190.  dc.w    428*4,404*4,381*4,360*4,339*4,320*4,302*4,285*4,269*4,254*4,240*4,226*4
  5191.  dc.w    214*4,202*4,190*4,180*4,170*4,160*4,151*4,143*4,135*4,127*4,120*4,113*4
  5192.  dc.w    214*2,202*2,190*2,180*2,170*2,160*2,151*2,143*2,135*2,127*2,120*2,113*2
  5193.  dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  5194.  dc.w    214/2,202/2,190/2,180/2,170/2,160/2,151/2,143/2,135/2,127/2,120/2,113/2
  5195. PERIODSEND:
  5196.  
  5197.  
  5198.     SECTION    DATA,BSS_p
  5199.  
  5200. UnPackedData:    ds.l    128*6
  5201. PattAdresses:    ds.l    1024
  5202. PATTLENS:    ds.w    1024
  5203.  
  5204. SAMVOL:        ds.b    256
  5205. Instruments:    ds.w    256
  5206. SampleType:    ds.b    256    ; 0-8bit ; 1-16bit
  5207.         ds.b    256    ; original
  5208. LoopTab:    ds.b    256
  5209. SAMFIN:        ds.l    256
  5210. SONGORDERS:    ds.w    1024+1
  5211.  
  5212. SONGORDERS0:    ds.w    1024+1
  5213. SONGORDERS1:    ds.w    1024+1
  5214. SONGORDERS2:    ds.w    1024+1
  5215. SONGORDERS3:    ds.w    1024+1
  5216. SONGORDERS4:    ds.w    1024+1
  5217.  
  5218. ahi_samples    ds.b    (4*4)*256
  5219. ModNameBuffer:    ds.b    44
  5220. SongNameBuffer:    ds.b    44
  5221.  
  5222. SongNameBuffer0:ds.b    44
  5223. SongNameBuffer1:ds.b    44
  5224. SongNameBuffer2:ds.b    44
  5225. SongNameBuffer3:ds.b    44
  5226. SongNameBuffer4:ds.b    44
  5227.  
  5228. InstrNames:    ds.b    256*30
  5229. InstrGeneralPan:
  5230.         ds.w    256
  5231.  
  5232.  
  5233. VolEnvelope:    ds.b    [[32*4]+6]*256    ; 1 - type / 2 - point number
  5234. PanEnvelope:    ds.b    [[32*4]+6]*256    ; 1 - type / 2 - point number
  5235.  
  5236. SamBuff:    ds.b    32*(1024+16)
  5237.  
  5238. SampleOffsets    ds.l    128+2
  5239. SampleOffsetsFT    ds.b    128+2
  5240.  
  5241.  
  5242. ; Channels
  5243. Channel1:    ds.b    ChanArea*128
  5244. ahi_channels    ds.l    128
  5245.  
  5246.  
  5247.  
  5248. MODBUFFER:
  5249.     ds.b    128*128-1572
  5250.     ds.b    1572
  5251. Tap_Buffer1:
  5252.     ds.b    2048
  5253. TAP_Buffer2:
  5254.     ds.b    2048
  5255. PackedPattLen:
  5256.     ds.w    1
  5257.  
  5258.  
  5259.  
  5260. MODULE:    incbin    'dh2:2.dbm'
  5261. ENDMODULE:
  5262.